上海第二工业大学本科毕业设计(论文) 4系统软件的设计与实现
Main STM32单片机串口、LCD模块初始化、GPS模块初始化 数据接收有效 否 是
定位信息显示 时间、经纬度等信息的获取 数据保存
图 4-2 主程序流程
4.3串口通信程序设计
STM32单片机有两个独立的串口UART2和UART3,两个串口分别与GPS模块的RXD、TXD和WIFI模块的URXD、UTXD相连,STM32单片机对GPS模块与WIFI模块的控制都是通过UART2和UART3来实现的,UART2和UART3通讯程序的主要功能就是对串口进行初始化、负责UART2和UART3的数据读取和写入。当串口2初始化结束以后,UART2和UART3读取或写入存储器内的数据,当等待接收缓存区为空时,USART2和UART3就可以分别接收GPS数据和WIFI数据,当等待发送的缓存区的数据为空时,接收到的GPS数据和WIFI数据就可以分别写入USART2和UART3,否则的话,GPS 数据和WIFI数据既进不来也出不去,USART2和UART3只有一直等待下去,直到等待接收缓存区的数据为空或等待发送缓存区的数据为空。综上所述,系统的串口通信模块可以
15
上海第二工业大学本科毕业设计(论文) 4系统软件的设计与实现
相应地分为三个模块:一是串口初始化模块,二是串口读取模块,三是串口写入模块,串口通信模块如图 4-3所示。
串口通信模块 串口初始化 串口读取 图 4-3串口通信模块
串口写入 4.3 GPS数据接收程序设计
GPS模块用来读取接收GPS接收器传来的数据,它的作用是从串口读取GPS信号信息,判断是否检测定位到GPS信号,进而获得GPS的位置、速度、时间数据等信息,并进行相应的处理,加载GPS数据信息,软件配置功能模块主要包括以下几个子模块:设置串口的波特率、设置模块的定位模式及启动模式切换,获取模块的天线状态等子模块,GPS任务流程如图4-4所示。GPS模块的程序设计见while循环语句。
Main
串口初始化
从串口读取GPS信号
否
是否有GPS信号
是 接收信息
图4-4 GPS模块执行任务图
16
上海第二工业大学本科毕业设计(论文) 4系统软件的设计与实现
while(1){
if(flag1ms==1){ flag1ms=0; }
if(flag10ms==1){ flag10ms=0; }
if(flag100ms==1){ flag100ms=0;
if(GPS_HalfTransferEnd){
/* 接收到GPS_RBUFF_SIZE一半的数据 */ /* 进行nmea格式解码 */ nmea_parse(&parser,(const char*)&gps_rbuff[0],HALF_GPS_RBUFF_SIZE,&info);
GPS_HalfTransferEnd = 0; //清空标志位 new_parse = 1; //设置解码消息标志 }
else if(GPS_TransferEnd){ /* 接收到另一半数据 */ nmea_parse(&parser,(const
char*)&gps_rbuff[HALF_GPS_RBUFF_SIZE],HALF_GPS_RBUFF_SIZE,&info);
GPS_TransferEnd = 0; new_parse =1; } else{
new_parse =0; }
if(new_parse){ //有新的解码消息 /* 串口输出解码得到的信息 */
17
上海第二工业大学本科毕业设计(论文) 4系统软件的设计与实现
printGpsInfo(&info); /* 液晶输出显示 */
displayGpsInfo(&info); new_parse = 0; //清解码消息标志 } } }
}
4.4 WIFI数据传输程序设计
4.4.1 WIFI的串口 AT指令
ESP8266模块选用“AT+指令协议”作为用户的控制协议。AT+指令协议采用的是一套基于ASCII 的命令行格式的指令集,这里“AT+指令协议”采用的是“命令+响应”的形式,绝大部分的指令需要接收方处理相应的指令后再返回响应消息指令,如果在执行前一个命令处理过程中再次接收到新的在执行任务的指令,则将其舍弃而不再返回任何消息指令,以下是对其语法格式和处理流程进行描述, AT指令见表4-1。[8] ,以下是相关程序设计。
void WifiGpioConfig(void); void WiFi_Init(void);
void ESP8266_Choose( FunctionalState enumChoose ); void ESP8266_Rst( void ); void ESP8266_AT_Test( void );
bool ESP8266_Cmd( char * cmd, char * reply1, char * reply2, u32 waittime ); bool ESP8266_Net_Mode_Choose( ENUM_Net_ModeTypeDef enumMode ); bool ESP8266_JoinAP( char * pSSID, char * pPassWord );
bool ESP8266_BuildAP( char * pSSID, char * pPassWord, char * enunPsdMode );
bool ESP8266_Enable_MultipleId( FunctionalState enumEnUnvarnishTx ); bool ESP8266_Link_Server(ENUM_NetPro_TypeDef enumE,char* ip,char*
18
上海第二工业大学本科毕业设计(论文) 4系统软件的设计与实现
ComNum,ENUM_ID_NO_TypeDef id);
bool ESP8266_StartOrShutServer(FunctionalState enumMode, char* pPortNum, char* pTimeOver);
bool ESP8266_SendString(FunctionalState enumEnUnvarnishTx,char* pStr,u32 ulStrLength,ENUM_ID_NO_TypeDef ucId);
char* ESP8266_ReceiveString( FunctionalState enumEnUnvarnishTx ); void ESP8266_STA_TCP_Client( void ); void ESP8266_StaTcpClient_ApTcpServer( void ); uint8_t ESP8266_CIPAP(char* pApIp);
表4-1 WIFI 功能 AT 指令一览表
4.4.2 WIFI的热点设计
WIFI热点设计时选择ESP8266工作模式为AP,开启Server后,端口号为80080,WIFI模块与STM32单片机之间通过USART3实现通信,WIFI设计的部分程序见附录1-2。程序加载成功后,可以看到形成的WIFI网络热点“SSPU-EE”,如图4-5所示。下面是WIFI热点程序设计。 /***************用户需要设置的参数*****************/
#define BulitApSsid \ //要建立的热点的名称 #define BulitApEcn \ //要建立的热点的加密方式 #define BulitApPwd \ //要建立的热点的密钥 #define TcpServerIP \ //服务器开启的IP地址 #define TcpServerPort \ //服务器开启的端口 #define TcpServerOverTime \ //服务器超时时间(单位:秒)
19