GSM模块_STM32实现GPRS与服务器数据传输经验总结

硬件环境

MCU:STM32F103RET6 (调试器:J-Link)

GSM模块:Ai-Thinker_A6 (安信可)(还需要配一个串口打印工具,当初选这个模块纯粹是因为价格是最便宜的)

-------------------------------------------------------------------------

软件环境

Keil4

-------------------------------------------------------------------------

开篇废话

    经过两周时间的编码、调试,终于实现了GSM模块通过GPRS连接服务器的功能,并成功移植到了公司自己的项目里面。趁着有点空,我就把整个开发调试的过程记录下来,给自己做个备忘,也给大家做个参考。

-------------------------------------------------------------------------

时间列表

2天时间完成底层驱动部分函数的编写。

4天时间完成模块与服务器的连接,测试实例:获取服务器的RTC信息。

1天时间移植到公司的项目,纯代码搬运工作。

3天时间测试修复BUG并优化代码,找BUG的这几天,有1天只修改了1条代码,我也是醉了。

-------------------------------------------------------------------------

函数清单和注意事项

(底层驱动部分)

1. IO口初始化:控制 IO 和通讯 IO,控制包括电源控制,复位和低功耗模式,通讯就是串口啦,相信大家应该都很熟悉了。

                      当然在这个基础上还可以组合出复位的功能,复位在GPRS连接出错的时候会用到。

2. 串口初始化:模块的波特率为115200,8位数据位,1位停止位,没有校验位和流控。

                      串口还需要两个发送函数,发送一个字节和发送一串字符串的。串口中断处理函数放到后面说。

3. AT指令操作:发送AT指令

                        设置GPRS数据长度

                        发送GPRS数据内容

                        接收GPRS数据内容

                        AT指令/GPRS数据解析

4. 串口中断函数:包含AT指令/GPRS数据解析 和 接收GPRS数据内容,判断AT指令是否发送成功。

    AT指令返回的结束符除了设置GPRS数据长度的是'>',其他都是"\r\n"。但是在判断接收结束的时候不能只考虑这两种情况,还有一个情况需要特殊处理,那就是当接收到GPRS数据的时候,完全有可能会出现'\r','\n'对应的十六进制数。解决的办法就是在接收到"+CIPRCV:xxx,"的时候,附带判断接收到的数据长度,"xxx"代表的是GPRS数据长度信息,字符型格式,在这里还需要做一个格式转换。数据长度的位数根据字符 ','来进行判断,',' 将AT命令和GPRS数据进行分割。"xxx"换算过来的数值决定了 ',' 后面接收到的数据长度。

    由于目前采用的SIM卡模块内部没有自带缓冲区,在GPRS数据接收的时候,需要另外开辟一个存储空间用于数据的临时存储,建议采用环形缓冲区Buffer, 将串口接收到的数据按顺序存储,这个部分在串口中断函数里面实现。在大循环里面将数据取出处理,并设置相关标志位。我一开始设计的时候只开辟了一个非环形的缓冲区,每次接收到完整的数据,会从缓冲区的0地址重新开始存储,那么就会导致未及时处理的数据被新的数据冲掉。 不知道有没有别家的SIM卡模块是自带缓冲区的。 


(主循环部分)

1. TCP/IP连接流程控制:

    step1、"AT\r\n"//检测模块串口工作

    step2、"AT+CCID\r\n"//检查是否插卡

    step3、"AT+CREG?\r\n"//检查网络注册情况

    step4、"AT+CGATT=1\r\n"//附着网络

    step5、"AT+CGDCONT=1,\"IP\",\"CMNET\"\r\n"//设置PDP参数

    step6、"AT+CGACT=1,1\r\n"//激活网络

    step7、 "AT+CIPSTART=\"TCP\",\"121.41.xxx.xxx\",port\r\n"//连接TCPIP服务器

    我用的这个模块硬件初始化差不多就要10秒了,在硬件初始化完成后,按照以上七步进行服务器连接,测试下来,连接的成功率还是蛮高的。前面两步是硬件检测用的,如果这两步都测不过,那就需要检查下硬件是否完整。三到六步如果返回ERROR,可重复发送,直至返回OK,每一步之间可间隔数秒。最后一步如果失败,需先关闭连接,再重新发起连接。如果第七步一直连接不成功,那么可以通过控制 IO 复位模块,当然也可以先确认下你的服务器的端口是否打开。

    我的经验是连接和通讯的过程中,如果出现错误的情况,复位模块是最有效和快捷的方式。在确认硬件连接正常的情况下,如果多次发送命令失败,返回ERROR的话,那你还是乖乖的复位它吧。

 

    另外两个AT命令也很好用

"AT+CIPCLOSE\r\n"//关闭TCPIP连接

"ATE0\r\n"//关闭回显,关闭自己发给模块的串口数据,调试的时候可以不开启这个功能,方便观察


2. 数据链路层数据处理:实现GPRS数据接收/发送控制,存储串口中断接收到的数据,发送GPRS数据长度和GPRS数据内容。

    这个函数里面需要注意的是发送GPRS长度和数据的操作,需要在一次操作流程里面完成。我一开始脑残的将GPRS数据长度和数据发送分开处理,导致设置完数据长度后,发送状态处于准备好的状态,此时只要检测到有数据是需要发送的,便会通过GPRS发送出去,而无法保证是当前数据长度对应的数据帧(我在这里一共开辟了8个数据缓存,但是没有对发送状态进行分开判断)。在设置完数据长度后,需要判断是否接收到字符'>',大概需要50毫秒的时间。一开始分开发送也是和这个'>'字符的操作有关的,我已经帮大家试过了,连在一起发就好了。

    发送完GPRS长度帧后,返回字符'>',接着发送数据帧,在模块返回"OK"之前,发送的数据都会被发送到服务器,导致通讯出错。所以在数据发送后,需要等待判断模块是否已经发送成功。


3. 超时判断:检测GPRS数据是否发送失败,失败后可关闭TCP/IP连接,进行重连,如果还是失败,可复位模块,重新进行TCP/IP连接流程。

-------------------------------------------------------------------------

小技巧

1、官方的例程里面,在GPRS数据发送完之后,需要发送结束符0x1A,其实是不需要的。


最近一直有朋友问我要代码,我整理了一下,代码和资料已经放到资源里面了,有需要的朋友请自行下载。

链接:STM32实现GPRS与服务器数据传输

RTU/DTU这种产品好像2000年左右就有了,淘宝上搜索一下基本上200左右的很多,这也是一个做烂了的东西了。工作之后接触硬件相关的工作就很少了,不过看到各种硬件的板子还是有点小兴奋,看来还是很喜欢折腾这些的,自己画个图焊接个板子,真的还挺开心。所以打算自己弄一点硬件玩玩纯粹当爱好了。 关于这个东西需要有什么功能,还没有想好不过支持MQTT协议是一定要的,后台自己也能写Java还算熟悉,采用NETTY + MQTT应该是个不错的选择。 好了,说说方案,基本上选STM32F407这个呢,主要还是性价比高,这颗料真的是大杀器,这么强悍的资源才卖20块人民币,外设就不说了,片上RAM有196K。GSM/GPRS这种通信技术用于工业现场也有很多年了,典型的三表集抄行业用的比较多,前段时间还流言说2.5G基站会陆续停止服务,针对昂贵的频谱资源还真是有必要,停肯定是会的只是时间的问题了,没有那么快,今年很流行的NB-IOT还没有普及开来,还是用这种成熟的技术吧。RJ45接口主要考虑用于配置或者用于通信吧,类似串口服务器应用,研华的串口服务器菊花链RJ45接口的要卖2000+,这是品牌价值,太值钱了,关于菊花链方案已经选定了LAN9303这颗带SWITCH的PHY了,期待还有折腾下一版本的精力和热情吧。 关于GSM/GPRS为何选择SIMCOM的这个还是因为性价比,SIM800C的性价比太高了同样也是20块钱人民币,能做的事情也不少,前提是采用EAT开发模式,主频300M用户可用的RAM有800K,关这些资源我能干太多事情了。 当然软件上支持两种开发模式,EAT方式直接使用内置的RTOS+SOCKET资源(运行在MTK平台上),LWIP方式使用RTOS+PPP拨号(运行在407平台上)。当然有个更吸引我的地方,Porting一款成熟的组态软件实现拖拽配置串口服务器功能的细节问题。 问题总结: 1)板子丝印太小了,看不清楚 2)RS232/RS485的RX和TX反了,RS232预留了0R电阻,可以交叉一下,RS485没法救了。 其他 1)大家觉得目前的rtu/dtu是否有什么需要改进的地方,功能上面的。 2)板子有多的,有感兴趣的可送空板子,邮费自理。 3)仅仅是兴趣,玩玩而已,后面的版本会考虑一些产品类型的东西。 GPRS无线数据传输终端原理图截图: SIM800C参考官方的硬件设计手册来: STM32F407大杀器: DTU模块GPRS无线数据传输终端电路PCB 3D截图:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值