概述:
本篇讲述MCU与NB模组串口通信的交互过程,包括串口通信是否正常,检测模组是否注网成功,基站信号等。首先要确定发送给NB模组的每一个指令和NB模组响应返回的数据格式(包括成功,失败,状态信息,或者其他错误)。
一 串口数据收发
NB模组波特率默认是9600,实际项目中我发现有少部分模组产品在终端用户用过1年后会串口通信异常,模组厂给我的建议是使用4800,所以我在这里也使用4800波特率。我使用G43X的LPUART ,PA3作为RX,PA4作为TX,相关LPUART配置代码可以直接从例程examples\LPUART\Polling中复制过来,这里讲下发送和接收的函数封装。
发送函数如下图:指定发送的第一个字节地址和要发送的字节个数
另一个发送函数,只需要指定字符串的首地址,就会发送字符串,前提是字符串以0作为结束标记
如下图,接收函数recv_data接收到数据就返回true,如果50毫秒都没有接收到,返回超时。clk0 在SysTick_Handler中++clk0,因为在主函数中调用了SysTick_Config(SystemCoreClock/100); 所以10ms会产生一次中断。
如下图:对接收函数recv_data的再次封装,参数指定接收的超时时间和已经接收到的字节长度,超时时间到了,函数就返回,同时在函数返回前,如果有接收到数据,输出RTT日志,这样可以看到具体接收到的内容。
在初始化完LPUART之后,在main函数调用send_AT_CMD 两次就进行两次串口发送和接收,如下图,是send_AT_CMD函数定义,调用了上面的发送和接收函数。注意函数send_AT_CMD定义在nbiot.c中,与nb模组的交互都是在此文件中。
如下图,第一次发送AT\r\n,因为NB模组不工作的时候是低功耗休眠,所以第一次返回error,第二次就会返回ok,说明NB模组的串口已经正确通信。注意AT指令数据格式:给NB模组发送的数据都是以\r\n结尾,而NB模组返回的数据都是以\r\n开头,\r\n结尾,所以在在日志中可以看到,AT只有后面只换行一次,而ERROR或者OK的前面换行一次,后面也一次。
二接收数据的分析
NB模组返回的数据可以分为2类,对于发送到NB模组的指令,一类是NB模组自己处理后即直接返回,不需要借助和基站进行网络通信,这一类返回速度极快,几十到几百毫秒,另一类是NB模组需要借助和基站进行网络通信,把从网络获取的数据返回来,这一类返回速度极慢,需要几秒,有时网络不好,或者第一次与基站连接时,需要几十秒或者更长时间,这里先讲第一类,第二类在下一篇sntp协议解析时讲。
下图是第一类返回速度极快的分析,只检测是返回ok,还是error,因为每一个具体at指令返回的数据内容不同,但是返回的数据中都会包含ok或者error,此函数用来判断模组at指令的执行是否完成。以下所讲代码都在nbiot.c中。
下图函数中可以执行3条AT指令,红框中的函数用来判断是否注网成功。如果有需要增加其他指令,可以在这里增加。
下图封装了执行上面3条指令的函数,如果AT_CGATT查询到注网成功,继续执行后面的流程,如果查询到注网没成功,延时1秒,再次查询,直到180次查询,即3分钟后停止查询,显示注网失败。
下图是执行结果,+CGATT:1表示注网成功,+CGATT:0表示注网失败,在第31次查询时注网成功了。
|