extern void Delay(__IO uint32_t nCount);
USARType USART_SendStr(UART_HandleTypeDef * USART_Handler,char * str)
{
while (*str != '\0')
{
while(__HAL_UART_GET_FLAG(USART_Handler,UART_FLAG_TXE)==RESET);
HAL_UART_Transmit(USART_Handler,(uint8_t *)str,,);
str++;
}
return USARTOK;
} /*
* 功能:固定时间指令匹配函数
* 入口参数1:串口句柄
* 入口参数2:串口接受缓冲区
* 入口参数3:发送的字符串
* 入口参数4:要匹配的字符串
* 返回值:
* USARTTIMEOUT:超时未读取到数据
* USARTOK :成功读取到数据
* USARTERROR :接受到数据,但是没有提取到*recestr
*/
USARType USART_Cmd_Marry(UART_HandleTypeDef * USART_Handler,Usart_RecerivePoint Rusart,char *sendstr,char *recestr)
{
/*通过串口发送指令*/
char * val;
char * str;
int count1 = ;
int count2 = ;
str = recestr;
USART_SendStr(USART_Handler,sendstr);//发送字符串
while (*recestr != '\0')//如果读取到\0则匹配完成
{
if(Usart_fifo_Read(Rusart,(uint8_t *)val,) == USARTOK)
{
if (*val == *recestr)//读取到的第一个字节数相同
{
recestr++;
}
else
{
recestr = str;
count1++;
if (count1 == )
{
return USARTERROR;
}
}
}
else
{
count2++;
Delay_ms();
if (count2 > )
{
return USARTTIMEOUT;
}
}
}
return USARTOK;
}
/*
* 功能:固定时间指令应答函数
* 入口参数1:串口句柄
* 入口参数2:串口接受缓冲区
* 入口参数3:发送的字符串
* 入口参数4:接受数据的地址
* 返回值:
* USARTTIMEOUT:超时未读取到数据
* USARTOK :成功读取到数据
*
*/
USARType USART_Cmd_Ack(UART_HandleTypeDef * USART_Handler,Usart_RecerivePoint Rusart,char *sendstr,char *recestr)
{
/*通过串口发送指令*/
char * val;
int count2 = ; USART_SendStr(USART_Handler,sendstr);
while ()
{
if(Usart_fifo_Read(Rusart,(uint8_t *)val,) == USARTOK)
{
*recestr = *val;
recestr++;
if (*val == )
{
*recestr = '\0';
return USARTOK;
}
}
else
{
Delay_ms();
count2++;
if (count2 > )
{
return USARTTIMEOUT;
}
}
}
}
/*
* 功能:可变时间指令匹配函数
* 入口参数1:串口句柄
* 入口参数2:串口接受缓冲区
* 入口参数3:发送的字符串
* 入口参数4:要匹配的字符串
* 入口参数5:限制的时间内检测,单位ms
* 入口参数6:限制的数据大小内查找,单位字节
* 返回值:
* USARTTIMEOUT:超时未读取到数据
* USARTOK :成功读取到数据
* USARTERROR :接受到数据,但是没有提取到*recestr
*/
USARType USART_Cmd_Time_Marry(UART_HandleTypeDef * USART_Handler,Usart_RecerivePoint Rusart,char *sendstr,char *recestr,uint16_t timeout,uint16_t countout)
{
/*通过串口发送指令*/
char * val;
char * str;
uint16_t count1 = ;
uint16_t count2 = ;
str = recestr;
USART_SendStr(USART_Handler,sendstr);//发送字符串
while (*recestr != '\0')//如果读取到\0则匹配完成
{
if(Usart_fifo_Read(Rusart,(uint8_t *)val,) == USARTOK)
{
if (*val == *recestr)//读取到的第一个字节数相同
{
recestr++;
}
else
{
recestr = str;
count1++;
if (count1 == countout)
{
return USARTERROR;
}
}
}
else
{
count2++;
Delay_ms();
if (count2 > timeout)
{
return USARTTIMEOUT;
}
}
}
return USARTOK;
} /*
* 功能:可变时间指令应答函数
* 入口参数1:串口句柄
* 入口参数2:串口接受缓冲区
* 入口参数3:发送的字符串
* 入口参数4:接受数据的地址
* 入口参数5:限制的时间内检测,单位ms
* 入口参数6:限制的数据大小内查找,单位字节
* 返回值:
* USARTTIMEOUT:超时未读取到数据
* USARTOK :成功读取到数据
*
*/
USARType USART_Cmd_Time_Ack(UART_HandleTypeDef * USART_Handler,Usart_RecerivePoint Rusart,char *sendstr,char *recestr,uint16_t timeout,uint16_t countout)
{
/*通过串口发送指令*/
char * val;
int count2 = ; USART_SendStr(USART_Handler,sendstr);
while ()
{
if(Usart_fifo_Read(Rusart,(uint8_t *)val,) == USARTOK)
{
*recestr = *val;
recestr++;
if (*val == )
{
*recestr = '\0';
return USARTOK;
}
}
else
{
Delay_ms();
count2++;
if (count2 > )
{
return USARTTIMEOUT;
}
}
}
}

这个里面一共有四段代码,其实是两段代码,只是因为需求不同而复制出来了而已

实现原理是一样的,目的是实现AT指令的匹配,和响应返回,详细信息在代码中都给出来了,这里面用到的数据类型和程序代码都在前面的文章中给出来了,我发出来的代码都是经过测试的,绝对可行,若有疑问可以添加QQ大家相互交流

05-04 02:26