要實作一個串口通信功能,流程為監聽UART3是否有資料傳過來(接收中斷),若有則在中斷處理中對UART3接收標志位置1,此時對接收到的資料進行處理以獲得快取陣列,然后將該快取陣列通過UART2(發送中斷)發送出來,此時實時監聽是否獲取到UART2的串口資料,若有則將獲取到的資料通過UART3發送出來(發送中斷)。其中UART2作為485串口通信。
現在的情況是,UART3能夠正常收到串口資料,并執行到UART2的發送步驟,但UART2在發送程序中:1、發送資料不全,例如設定要發送8位元組的快取陣列,實際只發送了2位元組的資料;2、只能對第一次接收的資料進行轉換發送,后續接收到的資料都不能再發送,我懷疑是有其他中斷打斷了UART2的發送程序。下面是主要代碼:
代碼主體是通過CUBEMX自動生成的,包括HAL_Init();、SystemClock_Config();、MX_GPIO_Init();,以及正點原子的相關初始化程式delay_init(180);、KEY_Init();、RS485Init(); 我對RS485Init()進行了調整,以符合實際情況:
void RS485Init(void)
{
PCF8574_Init(); //初始化PCF8574,用于控制RE腳
MX_USART2_UART_Init(); //初始化USART2
MX_USART3_UART_Init(); //初始化USART3
RS485_MODE_Set(0); //設定為接收模式
}
然后在進入死回圈前,呼叫HAL_UART_Receive_IT(&huart3,Rx_Buf2,8);以開啟UART3的接收中斷。
下面進入死回圈(只把U3-U2部分的內容放出來):
while (1)
{
if(rx_flag_U3) //UART3收到資訊標志,在接收中斷回呼函式中置1
{
uart_U3toU2(Rx_Buf2);
HAL_UART_Receive_IT(&huart3,Rx_Buf2,8);
}
}
void uart_U3toU2(uint8_t *pData)
{
if(pData[0] == 0x0A)
{
for(i=0;i<4;i++)
{
trans_buffer[0]=slav_num[i];
trans_buffer[1]=pData[1];
trans_buffer[2]=pData[2];
trans_buffer[3]=pData[3];
trans_buffer[4]=0x00;
trans_buffer[5]=0x02;
CRC_value = CRC_Chek((uint8_t*)&trans_buffer,6); //計算CRC值
trans_buffer[6]=(uint8_t)CRC_value; //CRC高8位
trans_buffer[7]=(uint8_t)(CRC_value>>8);
delay_ms(10);
RS485_MODE_Set(1); //設定為發送模式
HAL_UART_Transmit_IT(&huart2,trans_buffer,8); //串口2發送資料
while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC)!=SET); //等待發送完成
RS485_MODE_Set(0); //設定為接收模式
BEEP();
HAL_UART_Receive_IT(&huart2,Rx_Buf1,9); //串口2接收使能,接收長度為9位元組
delay_ms(10); //延時10ms作為結束
}
for(j=0;j<50;j++){trans_buffer[j]=0;pData[j]=0;}
}
}
我這邊UART3以100ms的間隔時間持續不斷發送14幀串口資料過來,每2s回圈一次,例如以100ms的間隔時間發送14幀“0A 01 03 04 00 00 00 00”,每2s重復發送上述14幀資料。
STM32這邊監控到每幀資料都能夠被接收到,但只有接收到的第一幀資料能夠進入上述資料轉換/發送的程式(即蜂鳴器會響4次),之后的所有資料都無法發送出去,但能聽到蜂鳴器有聲音但聲音很微弱的響聲,應該是執行了上述轉換/發送程式的,但是問題來了:
1、串口軟體監控顯示,第一幀發出來的資料全都不正常,例如為“01 01 FB” “02 01 FB” “03 01 FB” “04 01 FB”;
2、后續就再也沒有資料發送出來了,即實際沒有執行資料發送函式????
請各位大神幫我看下啊,哪里有問題,謝謝了!!!
uj5u.com熱心網友回復:
通信雙方都要給對方留出接收,處理的時間,不能連續收發。uj5u.com熱心網友回復:
一個while死回圈和10ms的延時還不夠一條資訊發送的嗎?不應該啊…
uj5u.com熱心網友回復:
我后來修改了,確實是連續發送時間不夠的原因,感謝啦
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/59922.html
標籤:單片機/工控
上一篇:[轉載]目錄遍歷攻擊決議
下一篇:【求助!】古董硬碟磁針一直在跳!
