以移遠的BC20為例
大家好 現在遇到個問題 用的方式是 STM32V6之串口HAL庫接收不定長位元組資料方法二-定時器超時計數-單資料接收模式 http://www.armbbs.cn/forum.php?mod=viewthread&tid=101391
比如有一條AT指令
[20:59:24.685]發→AT+MIPLOPEN=0,86400
[20:59:24.692]收←AT+MIPLOPEN=0,86400
OK
[20:59:24.939]收←
+MIPLEVENT: 0,4
[20:59:26.368]收←
+MIPLEVENT: 0,6
只有收到最后一條訊息+MIPLEVENT: 0,6才能證明登陸成功 判斷成功登陸的條件是if(strstr((const char*)g_tBspUart.pRxBuf,(const char*)"0,6") != NULL)
如果用常規接收方式比如串口空閑中斷 因為時間(注意時間)原因可能會被分割為三幀
從發送到接收完最后一包資料 一共需要近2s 也就是2000ms的時間 但我不可能就為了這一條資料 就把接收超時時間設定的特別長 對嗎
還有就是AT指令程式設計 比如MCU給模塊發一條指令
HAL_UART_Transmit(&huart3,close_command_echo,sizeof(close_command_echo),0xffff);
delay_ms(1500);
為了保證能收到訊息 我都會加一個delay_ms延時
然后用strstr函式做判斷 看收到的東西對不對 但有些時候不知道是不是延時的問題 列印到串口1的訊息就會缺失
然后整個AT指令的發送與判斷是用switch case來做的 指令基本都是用這樣的代碼再重復
HAL_UART_Transmit(&huart3,request_signal_quality,strlen(request_signal_quality),0xffff);
delay_ms(1500);
if(strstr((const char*)g_tBspUart.pRxBuf,(const char*)"OK") != NULL)
{
sscanf(g_tBspUart.pRxBuf,"\r\n+CESQ: %[^,],%[^,],%[^,],%[^,],%[^,],%s\r\n\r\nOK",&signal_value_t.signal_quality,\
&signal_value_t.bit_error_rate,&signal_value_t.RSCP,&signal_value_t.Ec_No,\
&signal_value_t.RSRQ,&signal_value_t.RSRP); //存到結構體陣列里的資訊有時候會丟失 列印出來是空白的 不知道是不是因為接收的時候有問題?
clear_buffer();
sprintf(return_signal_quality,\
"[BC20]Extend signal_quality: %s\r\n bit error rate: %s\r\n RSCP: %s\r\n Ec_No: %s\r\n RSRQ: %s\r\n RSRP: %s\r\n",\
&signal_value_t.signal_quality,&signal_value_t.bit_error_rate,\
&signal_value_t.RSCP,&signal_value_t.Ec_No,&signal_value_t.RSRQ,&signal_value_t.RSRP);
HAL_UART_Transmit(&huart1,return_signal_quality,strlen(return_signal_quality),0xffff); //某些時候列印出來的內容就是空白的 說明sscanf并沒有格式化資料存盤到結構體陣列里 偶爾會存在這個問題 現在就不知道原因是不是和延時有關系
如果有關系 應該怎么處理呢
memset(return_signal_quality,0,sizeof(return_signal_quality));
a=3;
g_tBspUart.rxFlag=0;
break;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/280026.html
標籤:C語言
上一篇:關于連續k進制輸出的一段代碼
下一篇:cpp中new出來的地址是相同的
