华为MG323驱动.docx
- 文档编号:6652217
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:16
- 大小:18.40KB
华为MG323驱动.docx
《华为MG323驱动.docx》由会员分享,可在线阅读,更多相关《华为MG323驱动.docx(16页珍藏版)》请在冰豆网上搜索。
华为MG323驱动
//固件库相关头文件
#include"stm32f10x.h"
//MDK头文件
#include
#include
//自定义头文件
#include"gprs.h"
#include"usart.h"
#include"flash.h"
//FreeRTOS相关头文件
#include"FreeRTOS.h"
#include"task.h"
#include"queue.h"
//模块供电及复位管脚定义
//控制LM2576ADJ给模块上电或断电
#definePWRONGPIO_ResetBits(GPIOB,GPIO_Pin_13);
#definePWROFFGPIO_SetBits(GPIOB,GPIO_Pin_13);
//开机后,RSTON>10ms模块复位
#defineRSTONGPIO_SetBits(GPIOB,GPIO_Pin_14);
#defineRSTOFFGPIO_ResetBits(GPIOB,GPIO_Pin_14);
//模块上电后,在关机状态TERMOFF变成TERMON1秒后可开机,开机状态TERMOFF变成TERMON1秒可关机,保持20秒又会开机
#defineTERMONGPIO_SetBits(GPIOB,GPIO_Pin_15);
#defineTERMOFFGPIO_ResetBits(GPIOB,GPIO_Pin_15);
//GprsInfo.state状态定义
#defineSTATE_BEGIN0//开机流程第1次GPRS_Reset时从此状态开机
#defineSTATE_POWER_ON1
#defineSTATE_TERM_ON2
#defineSTATE_RESET3//模块复位流程非第1次GPRS_Reset时从此状态复位
//#defineSTATE_PWRKEY_HIGH4
#defineSTATE_SEND_AT4//AT
#defineSTATE_RECEIVE_AT5
#defineSTATE_SEND_ATE06//ATE0关闭回显
#defineSTATE_RECEIVE_ATE07
#defineSTATE_SEND_ATI8//ATI查询产品信息
#defineSTATE_RECEIVE_ATI9
#defineSTATE_SEND_CPIN10//CPIN获取SIM卡PIN密码
#defineSTATE_RECEIVE_CPIN11
#defineSTATE_SEND_CGSN12//CGSN查询IMEI号
#defineSTATE_RECEIVE_CGSN13
#defineSTATE_SEND_CSQ14//CSQ查询信号强度
#defineSTATE_RECEIVE_CSQ15
#defineSTATE_SEND_COPS16//COPS查询运营商信息
#defineSTATE_RECEIVE_COPS17
#defineSTATE_SEND_CGATT18//CGATT查询GPRS服务状态
#defineSTATE_RECEIVE_CGATT19
#defineSTATE_SEND_SICS20//SICS设置Internet连接类型(GPRS)
#defineSTATE_RECEIVE_SICS21
#defineSTATE_SEND_SISS_TYPE22//SISS建立Internet服务类型(Socket)
#defineSTATE_RECEIVE_SISS_TYPE23
#defineSTATE_SEND_SISS_ADDR24//SISS设置UDP服务地址根据网址建立连接
#defineSTATE_RECEIVE_SISS_ADDR25
#defineSTATE_SEND_SISO26//SISO打开UDP服务
#defineSTATE_RECEIVE_SISO27
#defineSTATE_IDLE28//GPRS服务已经成功连接并空闲
#defineSTATE_SEND_SISW_LEN30//SISW设置发包长度
#defineSTATE_RECEIVE_SISW_LEN31
#defineSTATE_SEND_SISW_DATA32//发送数据包
#defineSTATE_RECEIVE_SISW_DATA33
#defineSTATE_SEND_SISR34//SISR读取数据包
#defineSTATE_RECEIVE_SISR35
//定义AT命令表
#defineCMD_AT"AT\r"
#defineCMD_ATE0"ATE0\r"
#defineCMD_ATI"ATI\r"
#defineCMD_CPIN"AT+CPIN?
\r"
#defineCMD_CGSN"AT+CGSN\r"
#defineCMD_CSQ"AT+CSQ\r"
#defineCMD_COPS"AT+COPS?
\r"
#defineCMD_CGATT"AT+CGATT?
\r"
#defineCMD_SICS"AT^SICS=0,conType,GPRS0\r"
#defineCMD_SISS_TYPE"AT^SISS=0,srvType,Socket\r"
#defineCMD_SISS_ADDR"AT^SISS=0,address,sockudp:
//"
#defineCMD_SISO"AT^SISO=0\r"
#defineCMD_SISW"AT^SISW=0,"
#defineCMD_SISR"AT^SISR=0,256\r"
//定义AT返回命令表
#defineRET_OK"OK\r\n"
#defineRET_ATI"MG323\r\n"
#defineRET_SENDLEN"^SISW:
0"
#defineRET_RCVDATA"^SISR:
0,1\r\n"
#defineRET_EWT"EWT"
#defineRET_CSQ"+CSQ:
"
#defineRET_ERROR"ERROR"
#defineGPRS_DEBUG
//#defineServerAddr":
10000\r"
//#defineServerAddr"221.6.15.222:
3030\r"
#definePACKETMAXSIZE256
struct_GPRS_INFO_STRUCT_
{
u8state;
u8rxState;//接收状态,0允许读取串口数据,1上次的数据还没有被应用程序取走,不能解析新数据
u16rxBytes;//收到模块的字节数
u8txTimer;//AT命令发送计时器,超时重发。
u16LinkTimer;//服务器连接计时器,超时则重启GPRS模块
u8rxATBuf[PACKETMAXSIZE];//AT命令接收缓存
u8txATBuf[PACKETMAXSIZE];//AT命令发送缓存
u8txDATABuf[PACKETMAXSIZE];//数据包发送缓存
u8*rxPacketPtr;//数据包的指针
u16rxPacketLen;//数据包的字节数
u8txLen;
u8txHoldTime;
u8rxflg;//0无数据包到达1有数据包到达
}GprsInfo;
#ifdefGPRS_DEBUG
#defineGPRS_DEBUG_MAXSIZE256
struct_GPRS_DEBUG_
{
u16len;
u8buf[GPRS_DEBUG_MAXSIZE];
}GprsDebug;
u32counter=0;
#endif
voidGPRS_Reset(u8rstnum)
{
#ifdefGPRS_DEBUG
if(GprsDebug.len+13 { sprintf(GprsDebug.buf+GprsDebug.len,"GPRS_Reset: %d\n",rstnum); GprsDebug.len+=13; } #endif memset((u8*)&GprsInfo,0,sizeof(GprsInfo)); if(rstnum==1) GprsInfo.state=STATE_BEGIN; else GprsInfo.state=STATE_RESET; } u16CommandSend(u8*ptr,u16len) { GprsInfo.txTimer=20;//超时重发时间20*50ms #ifdefGPRS_DEBUG if(GprsDebug.len+len+2 { memcpy(GprsDebug.buf+GprsDebug.len,"S: ",2); GprsDebug.len+=2; memcpy(GprsDebug.buf+GprsDebug.len,ptr,len); GprsDebug.len+=len; } #endif returnUSART1_Write(ptr,len); } voidGPRS_Transmit_Process(void) { switch(GprsInfo.state) { caseSTATE_BEGIN: GprsInfo.state=STATE_POWER_ON; GprsInfo.txHoldTime=0; PWROFF; TERMOFF; RSTOFF; break; caseSTATE_POWER_ON: if(! GprsInfo.txHoldTime) { PWROFF; TERMON; GprsInfo.txHoldTime++; } else { GprsInfo.txHoldTime++; if(GprsInfo.txHoldTime>20*1)//命令执行延时1秒 { PWRON; GprsInfo.state=STATE_TERM_ON; GprsInfo.txHoldTime=0; } } break; caseSTATE_TERM_ON: if(! GprsInfo.txHoldTime) { TERMON; GprsInfo.txHoldTime++; } else { GprsInfo.txHoldTime++; if(GprsInfo.txHoldTime>20*1)//命令执行延时1秒 { TERMOFF; GprsInfo.state=STATE_SEND_AT; GprsInfo.txHoldTime=0; } } break; caseSTATE_RESET: if(! GprsInfo.txHoldTime) { RSTON; GprsInfo.txHoldTime++; } else//复位时间50ms { RSTOFF; GprsInfo.state=STATE_SEND_AT; GprsInfo.txHoldTime=0; } break; caseSTATE_SEND_AT: if(CommandSend(CMD_AT,strlen(CMD_AT))) { GprsInfo.state=STATE_RECEIVE_AT; } break; caseSTATE_SEND_ATE0: if(CommandSend(CMD_ATE0,strlen(CMD_ATE0))) { GprsInfo.state=STATE_RECEIVE_ATE0; } break; caseSTATE_SEND_ATI: if(CommandSend(CMD_ATI,strlen(CMD_ATI))) { GprsInfo.state=STATE_RECEIVE_ATI; } break; caseSTATE_SEND_CPIN: if(CommandSend(CMD_CPIN,strlen(CMD_CPIN))) { GprsInfo.state=STATE_RECEIVE_CPIN; } break; caseSTATE_SEND_CGSN: if(CommandSend(CMD_CGSN,strlen(CMD_CGSN))) { GprsInfo.state=STATE_RECEIVE_CGSN; } break; caseSTATE_SEND_CSQ: if(CommandSend(CMD_CSQ,strlen(CMD_CSQ))) { GprsInfo.state=STATE_RECEIVE_CSQ; } break; caseSTATE_SEND_COPS: if(CommandSend(CMD_COPS,strlen(CMD_COPS))) { GprsInfo.state=STATE_RECEIVE_COPS; } break; caseSTATE_SEND_CGATT: if(CommandSend(CMD_CGATT,strlen(CMD_CGATT))) { GprsInfo.state=STATE_RECEIVE_CGATT; } break; caseSTATE_SEND_SICS: if(CommandSend(CMD_SICS,strlen(CMD_SICS))) { GprsInfo.state=STATE_RECEIVE_SICS; } break; caseSTATE_SEND_SISS_TYPE: if(CommandSend(CMD_SISS_TYPE,strlen(CMD_SISS_TYPE))) { GprsInfo.state=STATE_RECEIVE_SISS_TYPE; } break; caseSTATE_SEND_SISS_ADDR: sprintf(GprsInfo.txATBuf,"%s",CMD_SISS_ADDR); get_GPRSName(GprsInfo.txATBuf+strlen(GprsInfo.txATBuf)); *(GprsInfo.txATBuf+strlen(GprsInfo.txATBuf))='\r'; if(CommandSend(GprsInfo.txATBuf,strlen(GprsInfo.txATBuf))) { GprsInfo.state=STATE_RECEIVE_SISS_ADDR; } break; caseSTATE_SEND_SISO: if(CommandSend(CMD_SISO,strlen(CMD_SISO))) { GprsInfo.txTimer=20*8;//超时重发时间3s GprsInfo.state=STATE_RECEIVE_SISO; } break; caseSTATE_SEND_SISW_LEN: sprintf(GprsInfo.txATBuf,"%s%d\r",CMD_SISW,GprsInfo.txLen); if(CommandSend(GprsInfo.txATBuf,strlen(GprsInfo.txATBuf))) { GprsInfo.state=STATE_RECEIVE_SISW_LEN; } break; caseSTATE_SEND_SISW_DATA: if(CommandSend(GprsInfo.txDATABuf,GprsInfo.txLen)) { GprsInfo.state=STATE_IDLE; } break; caseSTATE_SEND_SISR: if(CommandSend(CMD_SISR,strlen(CMD_SISR))) { GprsInfo.state=STATE_RECEIVE_SISR; } break; default: break; } } voidGPRS_Receive_Process(void) { if(GprsInfo.rxState) return; GprsInfo.rxBytes=USART1_Read(GprsInfo.rxATBuf); if(GprsInfo.rxBytes) { #ifdefGPRS_DEBUG if(GprsDebug.len+GprsInfo.rxBytes+2 { memcpy(GprsDebug.buf+GprsDebug.len,"R: ",2); GprsDebug.len+=2; memcpy(GprsDebug.buf+GprsDebug.len,GprsInfo.rxATBuf,GprsInfo.rxBytes); GprsDebug.len+=GprsInfo.rxBytes; } #endif GprsInfo.rxATBuf[GprsInfo.rxBytes]=0; if(strstr(GprsInfo.rxATBuf,RET_RCVDATA)) GprsInfo.rxflg=1; if(strstr(GprsInfo.rxATBuf,RET_ERROR)) GPRS_Reset(3); switch(GprsInfo.state) { caseSTATE_RECEIVE_AT: if(strstr(GprsInfo.rxATBuf,RET_OK)) GprsInfo.state=STATE_SEND_ATE0; break; caseSTATE_RECEIVE_ATE0: if(strstr(GprsInfo.rxATBuf,RET_OK)) GprsInfo.state=STATE_SEND_ATI; break; caseSTATE_RECEIVE_ATI: if(strstr(GprsInfo.rxATBuf,RET_OK)) GprsInfo.state=STATE_SEND_CPIN; break; caseSTATE_RECEIVE_CPIN: if(strstr(GprsInfo.rxATBuf,RET_OK)) GprsInfo.state=STATE_SEND_CGSN; break; caseSTATE_RECEIVE_CGSN: if(strstr(GprsInfo.rxATBuf,RET_OK)) GprsInfo.state=STATE_SEND_CSQ; break; caseSTATE_RECEIVE_CSQ: if(GprsInfo.rxPacketPtr=strstr(GprsInfo.rxATBuf,RET_CSQ)) { if(atoi(GprsInfo.rxPacketPtr+strlen(RET_CSQ))) GprsInfo.state=STATE_SEND_COPS; } break; caseSTATE_RECEIVE_COPS: if(strstr(GprsInfo.rxATBuf,RET_OK)) GprsInfo.state=STATE_SEND_CGATT; break; caseSTATE_RECEIVE_CGATT: if(strstr(GprsInfo.rxATBuf,RET_OK)) GprsInfo.state=STATE_SEND_SICS; break; caseSTATE_RECEIVE_SICS: if(strstr(GprsInfo.rxATBuf,RET_OK)) GprsInfo.state=STATE_SEND_SISS_TYPE; break; caseSTATE_RECEIVE_SISS_TYPE: if(strstr(GprsInfo.rxATBuf,RET_OK)) GprsInfo.state=STATE_SEND_SISS_ADDR; break; caseSTATE_RECEIVE_SISS_ADDR: if(strstr(GprsInfo.rxATBuf,RET_OK)) GprsInfo.state=STATE_SEND_SISO; break; caseSTATE_RECEIVE_SISO: if(strstr(GprsInfo.rxATBuf,RET_OK)) GprsInfo.state=STATE_IDLE; break; caseSTATE_IDLE: if(GprsInfo.rxflg
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华为 MG323 驱动