单片机和4G模块通信总结(EC20)

        第一代数据汇集单元基本开发完毕,运行也有一年了,做下总结吧,希望能够给大家提供帮助。

4G模块选择的是移远的EC20,通过串口和单片机交互。其实是什么型号并不重要,大体的流程

和注意事项基本都一样。

相关文章:

 《AT指令的一种解析想法》

 《编程学习笔记之消息地图》

《添加MQTT思路及JSON包》 

一、硬件

首先4G模块本身功耗很高,尤其是4G模块刚上电开机瞬间,会有一个大的电流脉冲,这里我们

选择的芯片本身参数符合指标,但是实际使用时候,发现有一些模块损坏问题,现场反馈是后台

没有数据,查问题发现是MCU不断在重启,在查发现是4G模块重启导致MCU复位,再分析是4G

电源貌似处于一种震荡状态。查看正常4G电源启动波形,发现有一个电流脉冲,电压有个起伏,

硬件工程师建议是换取更大电流的IC芯片,我是在软件上把每次连接关闭4G电源流程去掉,减少

4G电源冲击,现场设备升级软件测试半年,没有发现问题

二、软件

4G模块本身的AT指令不复杂,我采用消息地图(请看AT指令的一种解析想法)方案。

消息地图:

const static msg_t c_tMSGMap[]  =  {
    {"ATE0\r\n",                lte_4g_protocol_default_send},
    {"ATE0\r\n",                lte_4g_protocol_default_send},
    {"ATE0\r\n",                lte_4g_protocol_default_send},
    {"ATE0\r\n",                lte_4g_protocol_default_send},
    {"AT+CPIN?\r\n",            lte_4g_protocol_CPIN},
    {"AT+CSQ\r\n",              lte_4g_protocol_CSQ},
    {"AT+CREG?\r\n",            lte_4g_protocol_CREG},
    {"AT+CGREG?\r\n",           lte_4g_protocol_CGREG},
    {"AT$MYNETCON",             lte_4g_protocol_MYNETCON},          //设置APN
    {"AT$MYNETCON1",            lte_4g_protocol_MYNETCON1},         //设置用户名和密码
    {"AT$MYNETACT=0,0\r\n",     lte_4g_protocol_MYNETACT},          //去激活
    {"AT$MYNETACT=0,1\r\n",     lte_4g_protocol_default_send},      //激活
    {"AT$MYNETACT?\r\n",        lte_4g_protocol_default_send},      //是否激活成功
    {"AT$MYNETSRV",             lte_4g_protocol_MYNETSRV},          //配置服务器IP和端口号
    {"AT$MYNETCLOSE=0\r\n",     lte_4g_protocol_MYNETCLOSE},        //关闭socket
    {"AT$MYNETOPEN=0\r\n",      lte_4g_protocol_default_send},      //创建socket
};

2.1AT执行逻辑

每个AT指令执行成功,则继续下一条,如果本条AT指令执行失败,则重复执行,最多执行10次,

如果10全部失败,则本轮结束,从第一条指令开始执行,如果5轮全部失败,则重新执行4G模块

硬件初始化流程(电源复位(可跳过),4G模块复位,开机),然后继续执行AT指令;

创建完成socket,则整个流程结束。

2.2收发逻辑

由于4G模块有收和发流程,在进行接收流程时候不能进行发送流程;在进行发送流程时候,不能

进行接收流程。否则4G模块不能收和发(实际测试发现此现象)。

2.2.1发送流程

历程:(发送流程不可打断)

MCU->4G:AT$MYNETWRITE=0,10 //向0 号Socket 发送10 字节数据

4G->MCU:$MYNETWRITE: 0,10

MCU->4G:123456789

4G->MCU:OK //数据发送成功

注意:发送数据为ASCII码,HEX变成ASCII,长度要增加一倍。

2.2.2接收流程

数据到来,主动上报模式:(接收流程不可打断)

4G->MCU:$MYURCREAD: 0

MCU->4G:AT$MYNETREAD=0,1460

4G->MCU:$MYNETREAD: 0,10 //有10 字节数据
                 1234567890
                  OK  //接收数据成功

注意:接收数据为ASCII码,ASCII变成HEX,长度要减少一倍。

 2.3创建SOCKET模式说明

 上面举例是TEXT模式,即文本模式;socket还支持HEX格式。

从以上可以看出,当选择是HEX模式时候,发往串口的数据就是原始数据,即用户发什么,服务器就收到什么。由于我的协议支持自定义数据格式(16进制),也支持MQTT格式(文本格式),因此我选择这种模式创建socket。

三、问题

1、现象4G模块不断重启

分析原因,是MCU主动发起4G重启流程,在分析,发现服务器不回复数据,导致登入服务器失败,但是测试服务器,发现服务器没有问题。把4G断电,重新复现现象,分析Log发现,4G模块在登入服务器后,一直再往服务器发送数据(下面传感器数据量太频繁),而服务器发给4G模块后,4G模块并没有报告$MYURCREAD(我自己做的定时read任务也没有起作用,由于一直在发送忙),导致4G模块接收缓存溢出(模块复位也不起作用),解决方案如下:

(1)和服务器通信改问答模式;

(2)强制定时读取4G模块数据(注意数据溢出,如果处理不好,很大概率会导致4G模块接收溢出)。

2、现场传感器全部掉线

运行了三天三夜后,传感器全部掉线。分析LOG,发现4G在不断重启,基站在不停登入服务器,再分析发现基站发送登入帧后,服务器也回复确认帧,但是基站没有解析出来,分析服务器下发报文,也是正确报文。怀疑原因:

(1)栈乱了,为了增加接收缓存,我调小了栈区;

(2)SRAM乱了,里面用的链表,有BUG;

(3)接收机制有BUG,当接收某个字节出错,导致长度出错,一直处于“死等”本帧收完状态,导致不解析。从LOG分析和代码分析,第三点可能性更大,增加接收数据后,5S没有收到完成帧,则清除buffer机制,测试下看看,有结果再发生来。程序已经跑了一周了,没有出现这个现象,基本确定就是原因(3)引起的,当时写逻辑代码时候特别注释了这个问题,只是后面测试没有出现。

3、客户要求域名登入

现场客户提出域名登入,不提供IP,查看AT手册没有发现域名相关指令,但是手册里面有如下说明:

 其中提到Address需要支持域名,于是进行如下测试:

结果:

4、增加HmacSHA256和 BASE64算法

客户那边是MQTT协议,本来是配置用户名和密码直接登入,考虑到安全问题,需要增加HmacSHA256和 BASE64和算法。具体算法是怎么实现的和算法原理,这里不做介绍,只说应用。

HmacSHA256算法下载地址:SHA256和HMAC-SHA256的C语言实现_HMAC-SHA256C-C文档类资源-CSDN下载

BASE64算法下载地址:C语言实现Base64编码/解码_开挂的熊猫-CSDN博客

经过验证,这两个算法都是没有问题的,这里说下使用注意地方:

1)HmacSHA256算法生成的是32个字节的HEX进制数,如果需要64字节的字符串,需要自己转换下,和算法本身无关,仅仅是生成的信息摘要格式转换;

2)BASE64算法的信息输入是什么格式,需要双方协议,和算法无关;

3)BASE64算法在提供的连接中使用的是malloc动态分配内存,这里根据自己实际使用环境修改,我是自己传入了一个数组地址;

4)BASE64算法在提供的连接中默认输入的是字符串格式,如果是HEX格式,需要做简单的修改。

5、STM32F407的CCRAM

以前开发过程中遇到一个奇怪的问题,就是把缓存开辟大一点lwip不正常,但是编译不报错,其他逻辑功能也正常,一直没有分析原因,今天有时间了,抽空来看看怎么回事。整个RAM大小是192K,我的RAM才125.88kB,lwip就不正常,现象是能ping通,但是TCP连接失败,如果把缓存调小到110.77kB是正常的。

首先看407内存分布:

0x2000 0000  有128K   所有外设、MCU都可以用

0x1000 0000  有64K      只有MCU能用,外设不能用

我的设想是在上层开辟为各个通信信道开辟大缓存,放到CCRAM里面,做收发缓存,协议解析等;然后和外设打交道时候进行内存拷贝,为外设单独开辟一个接受和发送数组。

我的应用层缓存是这么定义的:

static uint8_t            s_chServiceProtocolMemoryBuffer[7][(sizeof(service_protocol_user_memory_t)+sizeof(my_list_memory_t))*(SERVICE_PROTOCOL_MEMORY_BUFFER_SIZE)] __attribute__((section("RW_IRAM2")));

查看map文件:

 看到没有,被定义到了IRAM1区(虽然s_chServiceProtocolMemoryBuffer后面显示是RW_IRAM2,但是地址是0x200006c8,在IRAM1区),但是我定义的一些小数组,确实定义到了IRAM2区:

 说明我的语法没有错误,于是我把数组拆分了,结果如下:

 这次被定义到了IRAM2区,测试程序,LWIP能够正常建立TCP了。

我做了实验,把缓存定义超多64K,并没有报错,但是部分空间被定义在了IRAM1区;所以我猜,当IRAM2区空间不够,或者没有连续的空间,或者定义的单个数组过大,都会被定义到IRAM1区。

PS:即使是定义到了IRAM1区,但是我看了缓存,也是够的,但是lwip不能建立TCP连接,还是不清楚什么原因,有时间再查下。

### 回答1单片机4G模块 EC200S 的串口通信程序,一般分为初始化模块、发送数据接收数据三个步骤。 首先,要初始化单片机的串口口4G模块的串口口。单片机EC200S的串口口需要配置波特率、数据位、停止位奇偶校验位等参数,以确保它们之间的通信能够正常进行。 其次,要通过单片机的串口口发送数据到EC200S模块。可以使用单片机的发送函数,在发送缓冲区中放入待发送的数据,然后通过串口口发送出去。在发送之前,还需要检查发送缓冲区是否为空,以确保没有数据丢失。 最后,要在单片机上接收来自EC200S模块的数据。单片机也需要设置接收缓冲区,并通过中断或轮询方式来读取接收缓冲区中的数据。读取完成后,可以对接收到的数据进行处理,比如打印到显示屏上或进行其他操作。 需要注意的是,在进行单片机EC200S模块的串口通信时,还需要处理数据的传输格式。比如,可以使用ASCII码或二进制格式进行数据的传输。在发送接收数据时,需要进行格式的转换拆装,以确保数据能够正确传输解析。 以上就是单片机4G模块EC200S串口通信程序的一般步骤,具体实施时还需根据实际情况进行调整优化。 ### 回答2: 单片机4G模块EC200S之间的串口通信程序主要包含以下几个步骤: 1. 硬件连接:将单片机的串口TX(发送)引脚连接到EC200S的串口RX(接收)引脚,同时将单片机的串口RX(接收)引脚连接到EC200S的串口TX(发送)引脚。 2. 初始化串口:在单片机代码中,首先需要设置串口的波特率、数据位、停止位校验位等参数,并使能串口的接收发送功能。 3. 发送AT指令:通过串口向EC200S发送AT指令,以进行4G网络的连接、断开、发送短信等操作。可以使用串口发送函数将指令发送给EC200S。 4. 接收解析响应:通过串口接收函数,单片机可以接收到EC200S返回的响应信息。需要对响应信息进行解析,判断操作是否成功,并根据具体情况作出相应处理。 5. 串口中断处理:可以使用串口中断,当EC200S返回数据时,单片机可以通过中断响应快速处理接收到的数据,提高响应速度。 6. 错误处理:在通信过程中可能出现各种错误,如串口通信错误、AT指令错误等。需要对可能出现的错误进行处理,例如重新发送指令、检查串口连接等。 7. 其他功能扩展:根据具体需求,还可以实现其他功能,例如接收EC200S主动推送的数据、实现双向通信等。 综上所述,单片机4G模块EC200S之间的串口通信程序主要包括串口初始化、AT指令发送与接收、响应解析、错误处理等步骤。通过这些步骤,可以实现单片机4G模块之间的双向通信,并实现各种操作功能。 ### 回答3: 单片机4G模块EC200S的串口通信可以通过以下步骤实现: 1. 首先,将单片机的串口与4G模块的串口进行连接。确保连接正确,包括连接正确的引脚设置正确的电平转换电路。 2. 在单片机的程序中,使用相应的串口通信库来配置初始化单片机的串口通信功能。 3. 在单片机的程序中,设置好与4G模块通信的波特率、数据位、停止位等参数,确保与4G模块的串口通信参数一致。 4. 编写单片机程序,通过串口向4G模块发送指令或数据。可以使用串口发送函数将指令或数据发送到4G模块。 5. 在单片机程序中,通过串口接收函数接收4G模块返回的数据或响应。可以使用中断或轮询的方式进行接收。 6. 解析处理4G模块返回的数据。根据4G模块通信协议,对接收到的数据进行解析处理,以获取所需的信息或进行相应的操作。 7. 根据需要,可以设置超时机制或错误处理,以确保通信的稳定性可靠性。 8. 最后,测试调试单片机4G模块的串口通信程序,确保正常通信数据的正确传输。 总之,单片机4G模块EC200S之间的串口通信需要进行连接、初始化、设置参数、发送指令数据、接收返回的数据等步骤,并对返回的数据进行解析处理,以实现双方之间的通信
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值