OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5026|回复: 2

请问有没有做过通信模块 AT指令 数据发送 和 解析的大佬

[复制链接]

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
发表于 2021-4-25 21:43:37 | 显示全部楼层 |阅读模式
15金钱
以移远的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;
                                        }
                        }

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2019-8-6
在线时间
132 小时
 楼主| 发表于 2021-4-26 10:21:02 | 显示全部楼层
麻烦各位帮忙看看 谢谢
回复

使用道具 举报

13

主题

643

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2432
金钱
2432
注册时间
2019-12-28
在线时间
527 小时
发表于 2021-4-26 10:26:24 | 显示全部楼层
帮顶  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 21:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表