GPRS模块与STM32的数据传输

发布者:cheng1984最新更新时间:2018-04-22 来源: eefocus关键字:GPRS模块  STM32  数据传输 手机看文章 扫描二维码
随时随地手机看文章

函数清单和注意事项

(底层驱动部分)

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连接流程。


关键字:GPRS模块  STM32  数据传输 引用地址:GPRS模块与STM32的数据传输

上一篇:STM32CubeMX 生成的LWIP 调试问题
下一篇:STM32F407和LAN8720调试记录 (1)

推荐阅读最新更新时间:2024-03-16 16:00

STM32 systick 定时 时间计算
系统嘀嗒(SysTick)校准值寄存器 1.(SysTick) 系统嘀嗒时钟是由HCLK 分频 出来的。HCLK=SYSCLK=72MHz /* Select HCLK/8 as SysTick clock source */ SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); 当系统嘀嗒时钟设定为9 兆赫 或是: SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); 当系统嘀嗒时钟设定为72 兆赫 2.系统嘀嗒校准值固定到9000,当系统嘀嗒时钟设定为9 兆赫,产生1ms 时基。 /* SysTick interrupt eac
[单片机]
stm32专题二:GPIO输入—按键检测
新建板级支持包bsp_key.c和bsp_key.h GPIO输入配置过程: 定义初始化结构体; 开启RCC时钟,非常重要; 写入引脚和模式配置,不需要配置速度; 调用初始化函数,将初始化结构体写入对应的GPIO端口。 bsp_key.c包含两个函数,一个是初始化函数,另一个是按键扫描函数,会按键被按下时,返回按键的状态。 bsp_key.c #include bsp_key.h /** * @brief 按键初始化函数 */ void KEY_GPIO_Config(void) { // 定义GPIO初始化结构体 GPIO_InitTypeDef GPIO_InitStruct; // 开
[单片机]
基于STM32设计的计算器(实现基本运算)
1. 项目介绍 计算器是最常见的工具了,现在不管是手机、电脑都带有计算器功能,支持强大的科学运算等。 当前文章介绍的是STM32+LCD触摸屏设计的一个触摸计算器功能,实现基本的加减乘除,二进制转换显示等功能。LCD屏使用的是3.5寸带触摸屏的显示屏,方便操作屏幕,MCU采用STM32F103ZET6。 设计的这个计算器用到的硬件不多,主要是LCD屏和触摸屏,用到了一个W25Q64存储芯片,保存触摸屏校准后的一些配置数据,这个可有可无,只是方便不需要每次断电后重新校准。 运行效果图如下: 完整项目源码下载地址: https://download.csdn.net/download/xiaolong112662
[单片机]
基于<font color='red'>STM32</font>设计的计算器(实现基本运算)
(纯干货)使用STM32测量频率和占空比的几种方法
使用平台:官方STM32F429DISCOVERY开发板,180MHz的主频,定时器频率90MHz。 相关题目: (1)测量脉冲信号频率f_O,频率范围为10Hz~2MHz,测量误差的绝对值不大于0.1%。(15分) (2)测量脉冲信号占空比D,测量范围为10%~90%,测量误差的绝对值不大于2%。(15分) 思路一:外部中断 思路:这种方法是很容易想到的,而且对几乎所有MCU都适用(连51都可以)。方法也很简单,声明一个计数变量TIM_cnt,每次一个上升沿/下降沿就进入一次中断,对TIM_cnt++,然后定时统计即可。如果需要占空比,那么就另外用一个定时器统计上升沿、下降沿之间的时间即可。 缺点:缺陷显而易见,当频率提高,
[单片机]
(纯干货)使用<font color='red'>STM32</font>测量频率和占空比的几种方法
STM32笔记(四)---配置系统时钟实验
配置系统时钟实验 1 使用 HSE 一般情况下,我们都是使用 HSE,然后 HSE 经过 PLL 倍频之后作为系统时钟。 通常的配置是: HSE=8M, PLL 的倍频因子为: 9,系统时钟就设置成:SYSCLK = 8M * 9 = 72M。使用 HSE,系统时钟 SYSCLK 最高是128M(16倍频)。 当程序来到 main 函数之前,启动文件: statup_stm32f10x_hd.s 已经调用 SystemInit()函数把系统时钟初始化成 72MHZ, SystemInit()在库文件: system_stm32f10x.c 中定义。如果我们想把系统时钟设置低一点或者超频的话,可以修改底层的库文件,但是为了维
[单片机]
readelf 命令读取 STM32 编译生成的 ELF 和 AXF 文件
1、概述 readelf 命令,一般用于查看 ELF 格式的文件信息,常见的文件如在Linux上的可执行文件,动态库(*.so)或者静态库(*.a) 等包含ELF格式的文件。 可以在 windows 命令行或 Git bash 上查看。 2、readelf 常用命令 语法:readelf (选项)(参数:文件),除了-v和-H之外,其它的选项必须有一个被指定参数。 Usage: readelf Display information about the contents of ELF format files Options are: -a --all Equivalent to: -h -
[单片机]
iar &stm32调试过程中遇到的问题记录
10/16串口可以实现发送但是死或接受不了数据,前段时间还可以,但是不知道动了,不能入中断,后来加了增加几句关于标志位清除的函数后,可以进行接收数据了 1、串口都不能进入中断函数,造成HardFault_Hander,网上知道是由于不能进入中断造成的,需要添加中断向量,中断向量函数入口在启动文件startup_stm32f10x_hd_vl.s中,于是爸库里面的启动文件添加进来,但是报了天量的错误。一查,得知原来库里面的启动文件与IAR不兼容,于是在iar里面搜索“startup_stm32f1”的字样,找到文件里面D:Program Files (x86)IAR SystemsEmbedded Workbench 8.1ar
[单片机]
iar &<font color='red'>stm32</font>调试过程中遇到的问题记录
STM32的ADC的采样周期确定
  采样频率的确定   1.首先确定ADC 的时钟,这里需要看你的RCC的设置。在采用固件库的基础上,设定ADC的采样频率相对来说是很容易的。   (1)由时钟控制器提供的ADCCLK 时钟和PCLK2(APB2 时钟)同步。CLK 控制器为ADC 时钟提供一个专用的可编程预分频器。   (2) 一般情况下在程序 中将 PCLK2 时钟设为 与系统时钟 相同   RCC_HCLKConfig(RCC_SYSCLK_Div1);   RCC_PCLK2Config(RCC_HCLK_Div1);   RCC_PCLK1Config(RCC_HCLK_Div2);   (3)采样时间和转换时间   ADC 使用若干个ADC_CLK 周
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved