硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4951|回复: 10
收起左侧

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

[复制链接]

1

主题

14

回帖

17

积分

新手上路

积分
17
发表于 2021-4-26 10:45:10 | 显示全部楼层 |阅读模式
以移远的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;
                                        }
                        }
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2021-4-26 12:07:00 | 显示全部楼层
试试我们这个,效果还不错

(1)基于H7的串口WIFI模块ESP8266的TCP服务器例子和操作说明(AP兼STA模式)
http://www.armbbs.cn/forum.php?mod=viewthread&tid=94508

(2)基于H7的串口WIFI模块ESP8266的TCP客户端例子和操作说明(AP兼STA模式)
http://www.armbbs.cn/forum.php?mod=viewthread&tid=94509

(3)基于H7的中移动物联例子以及简易操作说明,方便电脑端和手机端远程查看数据
http://www.armbbs.cn/forum.php?mod=viewthread&tid=94528
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2021-4-26 12:09:53 | 显示全部楼层
给你推荐个开源项目,最近刚看到的
https://gitee.com/moluo-tech/ril

简介:
RIL是一款专门为嵌入式平台开发的无线通信模块(GSM/GPRS/CatM1/NB)管理框架,适用于资源受限物联网终端设备(单片机+无线蜂窝模组的方案),并提供物联网通信所需的基本功能,包含网络注册、连接管理、短信收发及Socket通信。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2021-4-27 08:47:07 | 显示全部楼层
gsnkey 发表于 2021-4-26 12:09
给你推荐个开源项目,最近刚看到的
https://gitee.com/moluo-tech/ril

谢谢分享。
回复

使用道具 举报

1

主题

14

回帖

17

积分

新手上路

积分
17
 楼主| 发表于 2021-4-27 08:56:47 | 显示全部楼层
eric2013 发表于 2021-4-26 12:07
试试我们这个,效果还不错

(1)基于H7的串口WIFI模块ESP8266的TCP服务器例子和操作说明(AP兼STA模式) ...

非常感谢您!
回复

使用道具 举报

1

主题

14

回帖

17

积分

新手上路

积分
17
 楼主| 发表于 2021-4-27 08:57:39 | 显示全部楼层
gsnkey 发表于 2021-4-26 12:09
给你推荐个开源项目,最近刚看到的
https://gitee.com/moluo-tech/ril

非常感谢!
回复

使用道具 举报

73

主题

1198

回帖

1417

积分

至尊会员

积分
1417
发表于 2021-4-27 10:24:00 | 显示全部楼层
gsnkey 发表于 2021-4-26 12:09
给你推荐个开源项目,最近刚看到的
https://gitee.com/moluo-tech/ril

谢谢分享~~~
回复

使用道具 举报

4

主题

46

回帖

58

积分

初级会员

积分
58
发表于 2021-4-27 22:45:47 | 显示全部楼层
你的程序里面有一个隐含BUG,你用了string库,意味着接收到的数据都是字符串,万一接收到的数据中间存在一个\0,string里面的函数就会错误,\0后面的数据全都会丢掉.
我用过EC20的模块遇到相同的问题,最后是自己写了KMP匹配算法进行数据匹配的.
回复

使用道具 举报

1

主题

14

回帖

17

积分

新手上路

积分
17
 楼主| 发表于 2021-4-28 09:16:38 | 显示全部楼层
dengxiaojundink 发表于 2021-4-27 22:45
你的程序里面有一个隐含BUG,你用了string库,意味着接收到的数据都是字符串,万一接收到的数据中间存在一个\0 ...

非常感谢您的提示
回复

使用道具 举报

1

主题

14

回帖

17

积分

新手上路

积分
17
 楼主| 发表于 2021-4-28 09:22:47 | 显示全部楼层
dengxiaojundink 发表于 2021-4-27 22:45
你的程序里面有一个隐含BUG,你用了string库,意味着接收到的数据都是字符串,万一接收到的数据中间存在一个\0 ...

您之前是收到什么信息里面会含有/0的呢?目前我还没遇到这种情况
回复

使用道具 举报

4

主题

46

回帖

58

积分

初级会员

积分
58
发表于 2021-4-28 17:17:39 | 显示全部楼层
lyy26655 发表于 2021-4-28 09:22
您之前是收到什么信息里面会含有/0的呢?目前我还没遇到这种情况

EC20偶尔返回的指令包里面就有\0,通讯传输的数据里面也有\0
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-13 03:33 , Processed in 0.294058 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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