一、系统设计约束
1、使用4G模块提供的AT命令集
2、AT指令回应规则:回应以0X0D 0X0A作为AT命名回应的结束
3、设计原则
AT命令应答一对一,不可以有交叉
采用状态机机制
使用异步操作方式,需要使用消息机制
4、发送和接收分离
针对4G的发送和接收,使用命令和数据分离的方式进行;SEND数据使用指定长度发送的方式(AT+QISEND=XXX),RECEIVE数据使用通过命令提取数据的方式(AT+QIRD=0,1,0,XXXX);通过此方式的选择保证数据和命令在串口输入和输出上不会出现命令和数据混杂的情况,简化程序设计。
二、流程图
三、状态机设计
状态机分为4G模块上电过程的状态部分,4G通讯过程状态部分;由于4G模块上电过程较多都需要对每一条AT命令的回应进行处理,所以分出多个上电过程的状态以满足 4G上电过程的要求;
第二个是GSM通讯过程状态,主要是IP 通讯过程中OPEN, CLOSE, SEND, RECEIVE四个过程,以此来定义状态;
AT 命令状态
STATUS_WAIT_CMD = 100,
STATUS_HW_INIT_CMD,
STATUS_HW_END_CMD,
STATUS_AT_SYNC_CMD,
STATUS_AT_E0_CMD,
STATUS_AT_IPR_CMD,
。。。
STATUS_AT_OPEN_CMD,
STATUS_AT_SEND_CMD,
STATUS_AT_RECEIVE_CMD,
STATUS_AT_CLOSE_CMD,
STATUS_AT_CLEAR_CMD,
回应状态STATUS_AT_SYNC =0,
STATUS_AT_E0,
STATUS_AT_IPR,
。。。
STATUS_AT_DISCONNECT_IDLE,
STATUS_AT_CONNECT_IDLE,
STATUS_AT_OPEN,
STATUS_AT_SEND,
STATUS_AT_RECEIVE,
STATUS_AT_CLOSE,
STATUS_AT_PARSE,
STATUS_AT_CLEAR,
四、主处理任务
static void 4G_Task(void)
{
while(1)
{
ATCMD 处理 4G_AtSendCmdProc(procstatus);
SELECT 等待接口命令和AT回馈
有接口消息命令,进行处理4G_MsgProc(pipebuffer, lenpipecount, &lenpipecount);
对应CMD设置;
有AT回馈,进行处理 procstatus =4G_DataProc(databuffer, lendatacount, &lendatacount, newprocstatus, 0);
}
}