意法半導體MCU STM32的GPRS數據傳輸技術資料

意法半導體是目前世界最大的半導體公司之一。目前爲止意法半導體MCU的增加速度已經超過了半導體工業的總體增加速度。自1999年起,ST始終是世界十大半導體公司之一。據最新的工業統計數據,意法半導體是全球第五大半導體廠商,在不少市場居世界領先水平。尤爲是生產得STM32的意法半導體MCU產品,被普遍應用在各類行業領域範圍,給當代社會帶來了更多的便利.國內本土MCU產品能替換代替兼容的主要有靈動微.一家致力於MCU產品和解決方案的廠商.服務器

下面本文要介紹的是有關於實現STM32 GPRS數據傳輸技術資料.網絡

一、實現細節ide

實現GPRS數據傳輸的原理是:STM32解析一串數據或命令,而後經過串口或其餘方式一個字符一個字符地發送給SIM900A模塊,SIM900A接收到數據以後再經過SIM卡發送到服務器。當SIM900A接收到數據時,當即響應中斷,按照中斷所設置的方式進行數據處理。此時,就須要經過發送檢驗和接收檢驗來控制數據的傳輸。函數

1.一、發送檢驗開發

因爲STM32逐個字符地將數據發送給SIM900A模塊,所以必須保證數據的正確性與連貫性。若是在發送的時候響應中斷或者進行任務調度,則發送將做廢,從而致使程序出錯,因此開發者必須警戒該類的錯誤出現。字符串

發送數據或者命令的時候,能夠將數據經過參數傳給發送函數,由發送函數統一控制,發送完成以後再返回一個發送完成標誌位,告知調用函數者發送已完成。源程序以下:產品

voidUSART_Send_Byte(charMyData){//發送字符函數
USART_ClearFlag(USART2,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;i《len;i++)
USART_Send_Byte(s[i]);//循環將字符串發送出去
if(s[i]==0x0a){//判斷髮送是否結束
SendCFFlag=TRUE;
//若是爲真,則發送完成標誌位置爲真
}else{
USART_Send_Byte(s[i]);//若是爲假,則發送出去
}
}it

1.二、接收檢驗
當SIM900A有數據返回或者有數據經過SIM900A接收到下位機時,STM32會當即響應中斷來接收數據。此時就要在中斷函數中進行一系列處理。以SIM900A爲例,SIM900A模塊返回的命令都是以「r」+「n」+「」結尾,所以檢驗傳輸結束能夠根據它進行判斷。在中斷響應函數(即stm32f10x_it.c文件裏)的USART2_IRQHandler函數能夠設置以下:class

voidUSART2_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的結束標識符。若是爲假,繼續接收;若是爲真,則將接收完成標識符置爲真。當接收完成標識符爲真時,說明接收完成,接下來就能夠進行數據處理了。

1.三、命令函數實現方法
下面將以AT+CIPSEND爲例,闡述發送數據的細節。經過初始化模塊、開啓網絡、創建接入點和創建TCP鏈接以後,就能夠開始發送數據。實現源代碼以下:

u8GPRS_Send(void){
u8i=0;
u8*p;
USART_SendToGPRS(「AT+CIPSENDrn」);//發送命令
Delay_ms(500);//延時500ms
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,「SENDOK」);
if(p!=0){//判斷是否發送成功
//發送成功操做
return1;
}else{
//發送失敗操做
return0;
}
}
}

該函數的基本思路是:首先發送命令,而後查找是否有「》」符號,若是有,則說明能夠開始發送數據。一段延時以後查找接收緩衝區是否有「SENDOK」字眼,有則說明發送成功,沒有則表示發送失敗。能夠根據判斷做進一步的操做。

相關文章
相關標籤/搜索