本帖最后由 ckdsx.cn 于 2023-10-9 16:47 编辑
本帖最后由 ckdsx.cn 于 2023-10-9 16:38 编辑
struct STRUCT_USART_Fram EC616S_Fram_Record_Struct = { 0 }; //定义了一个数据帧结构体
// cmd 待发送的指令
// ack1,ack2;期待的响应,为NULL表不需响应,两者为或逻辑关系
// time 等待响应时间
//返回1发送成功, 0失败
bool EC616S_Send_AT_Cmd(char *cmd,char *ack1,char *ack2,u32 time)
{
EC616S_Fram_Record_Struct .InfBit .FramLength = 0; //重新接收新的数据包
EC616S_USART("%s\r\n", cmd);
if(ack1==0&&ack2==0) //不需要接收数据
{
return true;
}
printf("delay some time to get receive data\r\n");
delay_ms(time); //提供足够的时间用于接收数据,(数据接收部分在uart中断usart.h --> USART2_IRQHandler(void) 中完成)
delay_ms(1000);
EC616S_Fram_Record_Struct.Data_RX_BUF[EC616S_Fram_Record_Struct.InfBit.FramLength ] = '\0';printf("EC616S_data:%s",EC616S_Fram_Record_Struct .Data_RX_BUF);
if(ack1!=0&&ack2!=0)
{
return ( ( bool ) strstr ( EC616S_Fram_Record_Struct .Data_RX_BUF, ack1 ) || //查询
( bool ) strstr ( EC616S_Fram_Record_Struct .Data_RX_BUF, ack2 ) );
}
else if( ack1 != 0 ) //strstr(s1,s2);检测s2是否为s1的一部分,是返回该位置,否则返回false,它强制转换为bool类型了
return ( ( bool ) strstr ( EC616S_Fram_Record_Struct .Data_RX_BUF, ack1 ) );
else if( ack2 != 0 )
return ( ( bool ) strstr ( EC616S_Fram_Record_Struct .Data_RX_BUF, ack2 ) );
else
return false;
printf("EC616S_data:%s",EC616S_Fram_Record_Struct .Data_RX_BUF);
if(ack1!=0&&ack2!=0)
{
return ( ( bool ) strstr ( EC616S_Fram_Record_Struct .Data_RX_BUF, ack1 ) || //查询
( bool ) strstr ( EC616S_Fram_Record_Struct .Data_RX_BUF, ack2 ) );
}
else if( ack1 != 0 ) //strstr(s1,s2);检测s2是否为s1的一部分,是返回该位置,否则返回false,它强制转换为bool类型了
return ( ( bool ) strstr ( EC616S_Fram_Record_Struct .Data_RX_BUF, ack1 ) );
else if( ack2 != 0 )
return ( ( bool ) strstr ( EC616S_Fram_Record_Struct .Data_RX_BUF, ack2 ) );
else
return false;
}
很多模块都用的是AT命令,直接使用是方便,但是还有好多同学不明白如何编写对应的操作函数,
以上是我找到的一段既有命令发送又有回调判断的通用函数示例,仅供参考! |