赞
踩
MCU和各种模块之间一般采用通过发送/接收AT命令。
本文主要是讲讲个人如何解析AT命令的,欢迎大家请留言指正,我将更新迭代。
最后附有完整的源代码链接。
1,打开串口(每个MCU不一样不过多赘述)
2,打开串口接收中断
void USART_IRQHandler(void)
{
......
if( rx2_cnt_in < RX_BUFF_SIZE )
{
rx2_buff[rx2_cnt_in++] = RXData;//接收数据放入缓存
if( rx2_buff[rx2_cnt_in-2] == '\r'&&rx2_buff[rx2_cnt_in-1] == '\n')//判断AT命令是否接收完成
{
is_rx2_done=true;//接收完成标准
}
if(rx2_cnt_in>=RX_BUFF_SIZE)
{
rx2_cnt_in = 0;
}
}
......
}
3,处理接收来的数据
void uart_at_handle(void)
{
......
while(rx2_cnt_in>rx2_cnt_out)//FIFO模式
{
p_rx = strstr((char *)&rx2_buff[rx2_cnt_out], "\r\n");//查找一句完整AT命令
if(p_rx != NULL)
{
len = (p_rx-(char*)&rx2_buff[rx2_cnt_out]);
if( len != 0 )
{
memset( buf , 0 , 100 );
memcpy( buf , &rx2_buff[rx2_cnt_out] , len );//复制整句AT命令
if( cmd != -1 )
{
at_data_analysis( &cmd , buf , len );//解析返回的AT数据
at_cmd_send( &cmd , buf , len );//发送下一个AT命令
}
else
{
cmd = at_cmd_analysis( buf , len );//解析返回的AT命令
}
}
rx2_cnt_out = (uint16_t)(p_rx-(char*)&rx2_buff)+2;//移除已经解析的部分
}
else
{
break;
}
}
......
}
static int8_t at_cmd_analysis( uint8_t *p_data , uint16_t len )
{
......
for( cmd=0 ; cmd<CMD_LIST ; cmd++ ) //解析查找AT命令
{
if(strstr( prf , at_cmd_list[cmd]) != NULL && (length == strlen(at_cmd_list[cmd])))
{
return cmd;
}
}
......
}
static void at_data_analysis( int8_t *cmd , uint8_t *p_data , uint16_t len )//解析返回的数据
{
......
}
void at_cmd_send( int8_t *cmd , uint8_t *p_data , uint16_t len )//发送下一个AT命令
{
p_rx = strstr((char *)p_data, "OK");//接收到模块返回OK
if( p_rx == NULL )
{
return;
}
......
//发送下一个命令
}
完整代码请参见:
JohnLiu-cloud/AT_Analysis: AT command of analysis module. (github.com)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。