背景,国产单片机,跑裸机。实现AT指令发送与接收,AT指令一般情况都是延迟300ms,这个时间单片机可以做好多事情,所以需要单片机在延迟时做其他事情。所以设计了一个软件架构,代码如下:
软件架构:
switch(cmd)
{
case AT_SEND://发送AT指令
{
USART_Send(USARTx_GPRS,AT_Cmd[index].SEND_CMD,AT_StrLength[index]); //串口发送数据 AT_Cmd存放AT指令数组
gTime.bDelay280msflg = 0;
cmd = CHEAK_TIME;
break;
}
case CHEAK_TIME: //查看时间
{
if(gTime.bDelay280msflg) //at指令延迟280ms
{
gTime.bDelay280msflg = 0;
cmd = CMPSTR;//时间已到,比较字符串
}
else{cmd = OTHER;}//时间没到,做其他事情
break;
}
case CMPSTR://比较字符串
{
AT_ReCount = Usart2_RecData(AT_ReBuff,1024);//获取at指令返回值
if(0 !=AT_ReCount)
{
if(strstr(AT_ReBuff,AT_Cmd[index].AcK)) //查找是否接受正确
{
index++; //正确,发送下一个AT指令
}
else
{
}
}
memset(AT_ReBuff,0,1024);
AT_ReCount = 0;
cmd = AT_SEND;
break;
}
case OTHER: //做事情
{
//用户自己实现
cmd = CHEAK_TIME; //查看时间
break;
}
}