基于STM32微处理器的GPRS数据传输技术的研究

发布者:SparklingSoul最新更新时间:2013-02-04 来源: 21IC 关键字:STM32  微处理器  GPRS  数据传输技术 手机看文章 扫描二维码
随时随地手机看文章

STM32是意法半导体(ST)公司推出的基于ARM Cortex-M3内核的主流产品之一,它是ST公司专门针对要求高性能、低功耗和低成本的嵌入式应用而设计的,目前已在各领域得到广泛的应用。SIM900A是SIMCom公司主推的一款紧凑型的GSM/GPRS双频模块产品,它以性能稳定、外观精巧及性价比高的优点深受广大工程师青睐。
 本文通过对STM32底层配置以及数据传输的研究,介绍STM32主要的底层配置,并着重介绍数据传输的实现。通过关键步骤的程序源代码的介绍,阐述实现数据传输的细节以及注意事项。该方法对其他项目或芯片有一定的实现价值和参考价值,且简单可靠,具有普遍性和通用性。
1 STM32底层配置
 为了实现STM32单片机与SIM900A模块之间的数据命令的传输,本文以串口为例,先搭建开发平台,在工程中加入相应的库函数以及配置文件,然后配置时钟以及串口相应的输入输出GPIO接口。在配置的同时,需要针对自身的原理图进行编写,才能保证配置正确无误。这样,基本的开发平台就搭建起来了。
1.1 串口配置
 在开发平台搭建起来之后,就可以对串口进行配置了。配置速率为115 200 b/s,字长为8 bit,1 bit停止位,串口模式为输入与输出模式,最后,初始化相对应的串口。初始化串口之后,打开串口的中断响应函数,即USART_ITConfig(USART2,USART_IT_RXNE,ENABLE)(以串口2为例),然后使能相对应的串口,这样串口函数就基本配置完成了。需要注意一点,有些程序可能在传输的时候出现首位丢失。这个问题涉及到USART的机制。硬件复位之后,USART的状态位是置位的(置1,表示已经发送完毕),而此时数据可以进行正常发送。当一帧数据发送后,由硬件将该位置位。而清除TC位(置0)是由软件来完成的,通过先读USART_SR,再写USART_DR将该位清除。但是程序在发送第一帧数据的时候,并没有进行读USART_SR,而是直接进行写USART_DR,因此TC标志位还是置1,并没有清除。当发送第一帧数据之后,用USART_GetFlagStatus()检测状态返回的是已经发送完毕,程序就会马上发送下一帧数据,因此第一帧数据就会被第二帧数据覆盖了,这样就看不到首位数据。根据这种情况,可以在每次传输之前或之后清除传输完成标志位,即USART_ClearFlag(USART2,USART_FLAG_TC)。
1.2 中断配置
 配置完串口之后,将对NVIC进行配置。首次配置中断分组,然后选择串口的中断,即NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn(以所使用固件库的定义为主)。
再设置抢占式中断优先级和响应式中断优先级,然后使能中断和初始化。以上的配置必须结合自身的情况,设计出最优的中断分组和优先级,以保证程序响应中断的速度。中断后所做的内容在stm32f10x_it.c文件里配置,下文将会详细阐述。
2 实现细节
 实现GPRS数据传输的原理是:STM32解析一串数据或命令,然后通过串口或其他方式一个字符一个字符地发送给SIM900A模块,SIM900A接收到数据之后再通过SIM卡发送到服务器。当SIM900A接收到数据时,立即响应中断,按照中断所设置的方式进行数据处理。此时,就需要通过发送检验和接收检验来控制数据的传输。
2.1发送检验
 由于STM32逐个字符地将数据发送给SIM900A模块,因此必须保证数据的正确性与连贯性。如果在发送的时候响应中断或者进行任务调度,则发送将作废,从而导致程序出错,所以开发者必须警惕该类的错误出现。
 发送数据或者命令的时候,可以将数据通过参数传给发送函数,由发送函数统一控制,发送完成之后再返回一个发送完成标志位,告知调用函数者发送已完成。源程序如下:
 void USART_Send_Byte(char MyData){ //发送字符函数
 USART_ClearFlag(USART2,USART_FLAG_TC);
 //清除标志位,如上所述
USART_SendData(USART2,MyData);//发送数据
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);//等待发送完成
}
void USART_Send_Str(char*s){//发送字符串
 int i;
 int len = strlen(s)-1;//字符串长度
for(int i=0;iUSART_Send_Byte(s[i]);//循环将字符串发送出去
if(s[i]==0x0a){//判断发送是否结束
SendCFFlag=TRUE;
//如果为真,则发送完成标志位置为真
}else{
USART_Send_Byte(s[i]);//如果为假,则发送出去
}
}[page]
2.2 接收检验
 当SIM900A有数据返回或者有数据通过SIM900A接收到下位机时,STM32会立即响应中断来接收数据。此时就要在中断函数中进行一系列处理。以SIM900A为例,SIM900A模块返回的命令都是以"r"+"n"+""结尾,因此检验传输结束可以根据它进行判断。在中断响应函数(即stm32f10x_it.c文件里)的USART2_IRQHandler函数可以设置如下:
void USART2_IRQHandler(void)
{
if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET){
//将接收字符存入接收缓冲区RxBuffer
RxBuffer[ReceCounter++]=(char)USART_ReceiveData(USART2);
//判断是否接收结束
if(RxBuffer[ReceCounter]==′′&& RxBuffer[ReceCounter-1]==0x0A &&
RxBuffer[ReceCounter-2]==0x0D){
ReceCFFlag=TRUE;
  }
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
}
}
 该函数的基本思路是:将USART接收到的字符逐个存入缓冲区,然后判断缓冲区最后3个字符是否为SIM900A的结束标识符。如果为假,继续接收;如果为真,则将接收完成标识符置为真。当接收完成标识符为真时,说明接收完成,接下来就可以进行数据处理了。
2.3 命令函数实现方法
 下面将以AT+CIPSEND为例,阐述发送数据的细节。通过初始化模块、开启网络、建立接入点和建立TCP连接之后,就可以开始发送数据。实现源代码如下:
u8 GPRS_Send(void){
u8 i=0;
u8*p;
USART_SendToGPRS("AT+CIPSENDrn");//发送命令
Delay_ms(500);//延时500 ms
p=LookFor_Str(RxBuffer,">");
//查找是否有">"符号,如果有,则可以发送数据
if(p!=0){
p=0;
memset(RxBuffer,0,BufferSize);//清空接收缓冲区
USART_SendToGPRS(GPRSSendData);//发送数据
Delay_ms(500);
 Delay_ms(500);
 Delay_ms(500);
 p=LookFor_Str(RxBuffer,"SEND OK");
if(p!=0){//判断是否发送成功
//发送成功操作
 return 1;
}else {
//发送失败操作
   return 0;
  }
   }
}

 


 该函数的基本思路是:首先发送命令,然后查找是否有“>”符号,如果有,则说明可以开始发送数据。一段延时之后查找接收缓冲区是否有“SEND OK”字眼,有则说明发送成功,没有则表示发送失败。可以根据判断作进一步的操作。命令的用法详见SIM900A配套的AT命令手册。有以下三点需要注意:
 (1)在本文测试程序中需要先获取IP然后才能建立TCP连接,这是由SIM900A机制决定的。所以如果开发者不能建立TCP连接,除了测试网络是否正常、服务器是否正确配置之外,还需在程序中先获取IP,命令为AT+CIFSR。
 (2)可以先获取SIM900A的状态,命令为AT+CIPSTATUS。根据状态来判定进行哪些操作,可以减少运行量,简化代码,从而减少运行时间,提高运行效率。详见SIM900A配套的AT命令手册。
 (3)延时的设定需要具体问题具体分析。例如,初始化SIM900A模块的时候,只需延时500 ms,模块返回的信息就接收到了,而接收来自服务器的信息时,有时由于信号问题或者巨大的数据量可能要延时久一点,而此时就需要开发者自行进行测试。延时的准确设置,可以在保证数据正确性的同时减少延时时间,从而提高程序的运行效率。
 本文通过对STM32微处理器串口的设置以及中断的配置来阐述STM32微处理器底层的配置,再通过SIM900A的发送和接收数据实现GPRS的数据传输技术,从而实现STM32微处理器接入互联网。在接收检验实现中,可以根据接收是否完成只作一次判断,从而减少中断运行时间。而SIM900A是GSM/GPRS双频模块,还可以实现通话、收发短信、HTTP及FTP传输等诸多功能,通过更深入的研究,可以最大限度地挖掘出该模块的实用价值,从而为电子产品提供更多的应用功能。

关键字:STM32  微处理器  GPRS  数据传输技术 引用地址:基于STM32微处理器的GPRS数据传输技术的研究

上一篇:基于LabVIEW的STM32调试平台设计
下一篇:STM32的便携式手机蓝牙考勤机系统设计

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

STM32 CubeMX 中如何查看系统时钟
代码如下: uint32_t sysclock = 0; sysclock = HAL_RCC_GetSysClockFreq(); 这样就可以在线仿真时看sysclock了,以判断单片机是否正常运行。这些函数都在rcc这个库文件里面,还可以查看时钟树上其他总线上的时钟。
[单片机]
STM32-(01):认识ARM
ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量的高性能、廉价、低耗能的RISC(Reduced Instruction Set Computer,中文是精简指令集计算机)处理器、相关技术及软件。技术具有性能高、成本低和能耗省的特点。适用于多种领域,比如嵌入控制、消费/教育类多媒体、DSP和移动式应用等。 市场份额 手机处理器90%以上的市场份额 上网本处理器30%的市场份额 平板电脑处理器70%的市场份额 基于ARM技术的微处理器应用约占据了32位嵌入式微处理器80%以上的市场份额。 风靡全球的几大原因: 1、功耗低 2、功能强 3、32位指令集 4、合作伙伴众多 5、产品线丰富
[单片机]
STM32-(01):认识ARM
STM32小白入门(第13天)-------RTC实时时钟和闹钟事件
一、RTC的概述 RTC就是实时时钟,详细英文 Real Time Clock。 二、详细描述 1.使用 2. 中断配置注意事项 三、程序设计 一)RTC唤醒事件 1. RTC的初始化 void rtc_init(void) { /* Enable the PWR clock ,使能电源时钟*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* Allow access to RTC,允许访问RTC */ PWR_BackupAccessCmd(ENABLE); /* Enable the LS
[单片机]
<font color='red'>STM32</font>小白入门(第13天)-------RTC实时时钟和闹钟事件
STM32单片机的IIC硬件编程---查询等待方式
IIC器件是一种介于高速和低速之间的嵌入式外围设备,其实总体来说,它的速度算是比较慢的。通常情况下,速度慢的器件意味着更多的等待,这对于精益求精的嵌入式工程师来说,简直就是一个恶梦,低速器件的存取数据实在是太浪费资源。如何面对这种低速设备,而使系统运行达到最优化?我觉得应当尽可能多的使用硬件完成,这样软件的开销便会减小,系统软件不用过多的时间去等待这些数据,而专注于硬件的请求和处理。 IIC协议,在笔者看来,其实并不是一种很好的协议,它没有较好的出错恢复机制,它是基于一种状态机模式的通讯协议,在这个状态转换中出现任意一步错误,将会导致总线不可恢复,极脆弱。在400KHZ的最高带通讯速率下,很多时候也极易产生干抗,因其采用了
[单片机]
基于LPC2214微处理器实现数字化UPS的设计
1 概述 目前UPS主要发展方向有两个:一是新的功能不断加强,例如增加远程监视、自动诊断、识别、事件记录、故障警告等功能;二是自身效率的提高。采用高效率的IC芯片和新的制造工艺,使空载功耗不断地降低,功率密度进一步提高。紧凑密集的空间设计给小型电子设备的应用带来了新的解决方案。 将功能强大的嵌入式微处理器(本文选用LPC2214)系统引入UPS,可以增强UPS的功能,使其具有网络化、智能化的特性,满足许多无人职守基站的用电要求。用数字控制代替模拟控制,可以消除温漂、老化等模拟器件存在的问题;抗干扰能力强,有利于参数整定和调节;通用性强,便于通过改变程序软件方便地调整方案和实现多种新型控制策略;同时高度集成的数字电路可以减少元件
[单片机]
基于LPC2214<font color='red'>微处理器</font>实现数字化UPS的设计
STM32入门学习笔记之基础定时器实验(上)
7.1 STM32定时器概述 STM32内部共有8个定时器,其中Timer1和Timer8属于高级定时器,Timer2~Timer5属于通用定时器,8个定时器的资源独立,互不影响。 STM32的通用定时器是一个通过可编程预分频器(PSC)驱动的16位自动装载计数器(CNT)构成。STM32的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)等。使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32的每个通用定时器都是完全独立的,没有互相共享的任何资源。 通用定时器的内部结构如下图所示。 7.2 相关寄存器 要使用通用定时器的基
[单片机]
<font color='red'>STM32</font>入门学习笔记之基础定时器实验(上)
STM32启动文件的选择及宏定义 及芯片型号更改 IAP总结
startup_stm32f10x_cl.s 互联型的器件,STM32F105xx,STM32F107xx startup_stm32f10x_hd.s 大容量的STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_hd_vl.s 大容量的STM32F100xx startup_stm32f10x_ld.s 小容量的STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_ld_vl.s 小容量的STM32F100xx startup_stm32f10x_md.s 中容量的STM32F101xx,STM32F102xx,STM3
[单片机]
采用C8051F410为微处理器实现光纤通信传输组件的设计
光纤通信在现代通信领域的地位日趋重要,因其具有带宽大、信噪比低、抗干扰的特点在工程建设中应用广泛。某新品研制中需要一款能够同时传输多路模拟电压信号、脉冲控制信号及故障指示信号的传输组件,若采用传统的电缆传输方式将不可避免地存在体积大、重量沉及传输性能受外界电磁辐射干扰大的问题。基于以上情况,文中采用以光纤通信的方式设计了一款实用的传输组件,满足新品设计要求。 1 整体架构 光纤传输组件是指以光纤作为传输信道的功能器件,通常包括发射端、接收端、光纤跳线3部分。主要原理即是在采集端实现电光转换,在接收端实现光电转换,通过光纤实现两端通信的连接。由于其特殊的传输材质和模式,使得光纤传输组件可满足在某些特殊工作环境下的要求。组件主要由
[单片机]
采用C8051F410为<font color='red'>微处理器</font>实现光纤通信传输组件的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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