高级会员

- 积分
- 581
- 金钱
- 581
- 注册时间
- 2019-8-6
- 在线时间
- 132 小时
|

楼主 |
发表于 2021-4-25 21:43:59
|
显示全部楼层
以移远的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;
}
|
|