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

上传人:白大夫 文档编号:3412152 上传时间:2019-08-22 格式:DOC 页数:5 大小:23.50KB
返回 下载 相关 举报
基于STM32微处理器的GPRS数据传输技术的研究.doc_第1页
第1页 / 共5页
亲,该文档总共5页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《基于STM32微处理器的GPRS数据传输技术的研究.doc》由会员分享,可在线阅读,更多相关《基于STM32微处理器的GPRS数据传输技术的研究.doc(5页珍藏版)》请在三一文库上搜索。

1、基于STM32微处理器的GPRS数据传输技术的研究本文通过对STM32底层配置以及数据传输的研究,介绍STM32主要的底层配置,并着重介绍数据传输的实现。通过关键步骤的程序源代码的介绍,阐述实现数据传输的细节以及注意事项。该方法对其他项目或芯片有一定的实现价值和参考价值,且简单可靠,具有普遍性和通用性。1、STM32底层配置为了实现STM32单片机与SIM900A模块之间的数据命令的传输,本文以串口为例,先搭建开发平台,在工程中加入相应的库函数以及配置文件,然后配置时钟以及串口相应的输入输出GPIO接口。在配置的同时,需要针对自身的原理图进行编写,才能保证配置正确无误。这样,基本的开发平台就搭

2、建起来了。1.1、串口配置在开发平台搭建起来之后,就可以对串口进行配置了。配置速率为115200b/s,字长为8bit,1bit停止位,串口模式为输入与输出模式,最后,初始化相对应的串口。初始化串口之后,打开串口的中断响应函数,即USART_ITConfig(USART2,USART_IT_RXNE,ENABLE)(以串口2为例),然后使能相对应的串口,这样串口函数就基本配置完成了。需要注意一点,有些程序可能在传输的时候出现首位丢失。这个问题涉及到USART的机制。硬件复位之后,USART的状态位是置位的(置1,表示已经发送完毕),而此时数据可以进行正常发送。当一帧数据发送后,由硬件将该位置位

3、。而清除TC位(置0)是由软件来完成的,通过先读USART_SR,再写USART_DR将该位清除。但是程序在发送第一帧数据的时候,并没有进行读USART_SR,而是直接进行写USART_DR,因此TC标志位还是置1,并没有清除。当发送第一帧数据之后,用USART_GetFlagStatus()检测状态返回的是已经发送完毕,程序就会马上发送下一帧数据,因此第一帧数据就会被第二帧数据覆盖了,这样就看不到首位数据。根据这种情况,可以在每次传输之前或之后清除传输完成标志位,即USART_ClearFlag(USART2,USART_FLAG_TC)。1.2、中断配置配置完串口之后,将对NVIC进行配置

4、。首次配置中断分组,然后选择串口的中断,即NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn(以所使用固件库的定义为主)。再设置抢占式中断优先级和响应式中断优先级,然后使能中断和初始化。以上的配置必须结合自身的情况,设计出最优的中断分组和优先级,以保证程序响应中断的速度。中断后所做的内容在stm32f10x_it.c文件里配置,下文将会详细阐述。2、实现细节实现GPRS数据传输的原理是:STM32解析一串数据或命令,然后通过串口或其他方式一个字符一个字符地发送给SIM900A模块,SIM900A接收到数据之后再通过SIM卡发送到服务器。当SIM900A

5、接收到数据时,立即响应中断,按照中断所设置的方式进行数据处理。此时,就需要通过发送检验和接收检验来控制数据的传输。2.1、发送检验由于STM32逐个字符地将数据发送给SIM900A模块,因此必须保证数据的正确性与连贯性。如果在发送的时候响应中断或者进行任务调度,则发送将作废,从而导致程序出错,所以开发者必须警惕该类的错误出现。发送数据或者命令的时候,可以将数据通过参数传给发送函数,由发送函数统一控制,发送完成之后再返回一个发送完成标志位,告知调用函数者发送已完成。源程序如下:voidUSART_Send_Byte(charMyData)/发送字符函数USART_ClearFlag(USART2

6、,USART_FLAG_TC);/清除标志位,如上所述USART_SendData(USART2,MyData);/发送数据while(USART_GetFlagStatus(USART2,USART_FLAG_TC)=RESET);/等待发送完成voidUSART_Send_Str(char*s)/发送字符串inTI;intlen=strlen(s)-1;/字符串长度for(inTI=0;ilen;i+)USART_Send_Byte(si);/循环将字符串发送出去if(si=0x0a)/判断发送是否结束SendCFFlag=TRUE;/如果为真,则发送完成标志位置为真elseUSART_S

7、end_Byte(si);/如果为假,则发送出去2.2、接收检验当SIM900A有数据返回或者有数据通过SIM900A接收到下位机时,STM32会立即响应中断来接收数据。此时就要在中断函数中进行一系列处理。以SIM900A为例,SIM900A模块返回的命令都是以r+n+结尾,因此检验传输结束可以根据它进行判断。在中断响应函数(即stm32f10x_it.c文件里)的USART2_IRQHandler函数可以设置如下:voidUSART2_IRQHandler(void)if(USART_GeTITStatus(USART2,USART_IT_RXNE)!=RESET)/将接收字符存入接收缓冲区

8、RxBufferRxBufferReceCounter+=(char)USART_ReceiveData(USART2);/判断是否接收结束if(RxBufferReceCounter=RxBufferReceCounter-1=0x0ARxBufferReceCounter-2=0x0D)ReceCFFlag=TRUE;USART_ClearITPendingBit(USART2,USART_IT_RXNE);该函数的基本思路是:将USART接收到的字符逐个存入缓冲区,然后判断缓冲区最后3个字符是否为SIM900A的结束标识符。如果为假,继续接收;如果为真,则将接收完成标识符置为真。当接收完

9、成标识符为真时,说明接收完成,接下来就可以进行数据处理了。2.3、命令函数实现方法下面将以AT+CIPSEND为例,阐述发送数据的细节。通过初始化模块、开启网络、建立接入点和建立TCP连接之后,就可以开始发送数据。实现源代码如下:u8GPRS_Send(void)u8i=0;u8*p;USART_SendToGPRS(AT+CIPSENDrn);/发送命令Delay_ms(500);/延时500msp=LookFor_Str(RxBuffer,);/查找是否有符号,如果有,则可以发送数据if(p!=0)p=0;memset(RxBuffer,0,BufferSize);/清空接收缓冲区USAR

10、T_SendToGPRS(GPRSSendData);/发送数据Delay_ms(500);Delay_ms(500);Delay_ms(500);p=LookFor_Str(RxBuffer,SENDOK);if(p!=0)/判断是否发送成功/发送成功操作return1;else/发送失败操作return0;该函数的基本思路是:首先发送命令,然后查找是否有符号,如果有,则说明可以开始发送数据。一段延时之后查找接收缓冲区是否有SENDOK字眼,有则说明发送成功,没有则表示发送失败。可以根据判断作进一步的操作。命令的用法详见SIM900A配套的AT命令手册。有以下三点需要注意:(1)在本文测试程

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1