AT指令代码与实现方法(基于C语言)

3 篇文章 0 订阅

WiFi、蓝牙、4G等多种通信模块均需使用AT指令进行配置和通信。基于μCOSIII操作系统,写了个AT指令的代码,也可以简单修改后用于裸奔系统。简单介绍一下,完整代码下载链接为:

https://download.csdn.net/download/hnxyxiaomeng/10815656

1、AT配置结构体

设计了一个结构体stcATConfig,可以对发送的每个指令分别进行配置。

typedef struct
{
uint16_t        resp_time100ms;//发送后查询返回信息的延时,100ms为单位。可设为指令最大响应时间。
uint8_t         try_delay1ms; //发送失败后再次发送时的延时,1ms为单位
uint8_t         max_try_times; //最大重试次数
uint8_t         max_reset_times; //最大重启次数
} stcATConfig;

2、AT指令注册函数

在发送AT指令之前,需要先注册AT指令的运行环境,包括如下4项。

void AT_RegisterHandler(SendMsgFunc_t func, char* recv_buf, OS_SEM* recv_sem, OS_MUTEX* buf_mutex)
{
	SendMsgCallback=func;             //串口发送数据的函数
	pRecvAckSem = (OS_SEM*)recv_sem;  //串口收到AT指令回令的信号量,可在串口接收空闲后发出
	pAckBufMux=(OS_MUTEX*)buf_mutex;  //串口接收缓冲区互斥信号量
	atAckBuf = (char*)recv_buf;		  //串口接收缓冲区
	return;
}

3、发送AT指令函数和发送AT字符数组函数

二者的主要区别是:

(1)发送AT指令函数主要用于发送AT配置命令,发送的都是字符串,发送函数遇到"\0"时就停止。发送AT字符数组函数主要用于发送数据,发送的时char型数组,遇到"\0"时不停止,且需指定发送的数组长度。比如,用EC20模块发布MQTT消息时,发完PUB命令后,就需要直接发送一个数组作为数据。

(2)发送AT指令函数在多次发送失败后,可以根据设置多次重启硬件。发送AT字符数组函数不重启硬件。

/*****************************************************************
* 功能:发送AT指令
* 输入: send_buf:发送的字符串
		recv_str:期待回令中包含的子字符串
        p_at_config:AT配置
* 输出:执行结果代码
******************************************************************/
uint8_t AT_SendCmd(const char *send_str,const char *recv_str,stcATConfig *p_at_config)
{
    ......
}

/*****************************************************************
* 功能:发送数组数据
* 输入: send_buf:发送的数组
		buf_len:数组长度
		recv_str:期待回令中包含的子字符串
        p_at_config:AT配置
* 输出:执行结果代码
******************************************************************/
uint8_t AT_SendData(const char *send_buf,const uint16_t buf_len,const char *recv_str,stcATConfig *p_at_config)
{
    ......
}

4、清空接收缓冲区和搜索响应字符串函数

均是局部函数,清空接收缓冲区函数在每次发送AT指令或数据前调用,搜索响应字符串函数在发送AT指令后调用。

/*****************************************************************
* 功能:查询AT指令的回令中是否有需要的字符串
* 输入: recv_str:期待输出字符串中需要含有的子字符串,如"OK\r\n"
        max_resp_time:指令最大响应时间,单位100ms
* 输出:查找到的子字符串指针
******************************************************************/
char* AT_SearchRecvBuf(const char* recv_str,uint16_t max_resp_time)
{
	...
}
/******************************************
* 功能:清空串口接收缓冲区
******************************************/
void AT_ClearAckBuff(void)
{
    ...
}

5、举个例子

(1)先注册AT指令运行环境

AT_RegisterHandler(Uart_SendData,atAckBuf,&ATRecvAckSem,&ATRecvAckMux);

其中Uart_SendData是串口发送函数,符合typedef void (*SendMsgFunc_t)(uint8_t * buf, uint32_t len);的形式即可。

atAckBuf是串口接收数组char[],ATRecvAckSem和ATRecvAckMux分别是串口接收数据信号量和串口接收数组互斥信号量。

OSSemCreate((OS_SEM*)&ATRecvAckSem,"ATRecvAckSem",0,&_err);
OSMutexCreate((OS_MUTEX*)&ATRecvAckMux,"ATRecvAckMux",&_err);

(2)发送AT指令

stcATConfig iotATConfig;
stcATConfig * pATConfig = &iotATConfig;

pATConfig->resp_time100ms = 1; //最大响应时间100ms
pATConfig->try_delay1ms = 100; //响应失败后再次发送时延时100ms
pATConfig->max_try_times = 10; //最大重试次数:10
pATConfig->max_reset_times =0; //最大重启次数:0

_ret = AT_SendCmd("ATI\r\n","OK\r\n",pATConfig);//发送"ATI\r\n"后,响应中包含"OK\r\n"才算响应正常

....

pATConfig->resp_time100ms = 500; //最大响应时间50s
pATConfig->try_delay1ms = 100; //响应失败后再次发送时延时100ms
pATConfig->max_try_times = 10; //最大重试次数:10
pATConfig->max_reset_times =0; //最大重启次数:10
_ret = AT_SendCmd("******\r\n","\r\n+QMTOPEN:",p_AT_Config);//发送"***\r\n"后,响应中包含"\r\n+QMTOPEN:"才算响应正常

(3)发送AT数据

与发送AT指令类似,更简单,不举例了。

  • 17
    点赞
  • 162
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 很抱歉,由于我是一个语言模型,我无法提供完整的代码。但是我可以提供一些指导和技巧。 若要开发基于C语言的蓝牙控制小车,需要做以下几件事: 1. 使用蓝牙模块连接小车和控制端(如手机或电脑)。 2. 编写C语言代码来发送控制命令,如前进、后退等。 3. 在小车端编写代码来接收并执行这些命令。 请注意,这仅仅是一个大致的概述,实际开发过程中可能需要其他步骤,如配置蓝牙模块等。 ### 回答2: 基于C语言的蓝牙小车代码主要涉及以下几个方面: 1. 蓝牙模块初始化:首先,需要初始化蓝牙模块,设置通信参数。可以使用AT指令集来配置蓝牙模块的工作模式、波特率等。 2. 串口通信:通过串口与蓝牙模块进行通信。使用C语言的串口操作函数来实现数据的发送和接收。 3. 小车控制:利用蓝牙模块接收到的指令来控制小车的动作。可以通过定义控制指令对应的动作函数来实现前进、后退、转向等功能。例如,当接收到前进指令时,调用前进函数来控制小车向前运动。 4. 控制指令解析:通过蓝牙模块接收到的数据进行解析,判断并执行相应的控制动作。可以使用条件语句来判断接收到的指令,并调用相应的控制函数。 5. 主循环:在主循环中不断接收蓝牙模块发送的数据,并进行解析和控制操作。可以使用无限循环来实现这个功能。 6. 调试信息输出:可以在代码中添加调试信息的输出,方便调试和查看程序的运行状态。可以通过串口将调试信息发送到电脑上的终端窗口进行显示。 总之,基于C语言的蓝牙小车代码主要包括蓝牙模块初始化、串口通信、小车控制、控制指令解析、主循环和调试信息输出等功能。通过合理的代码设计和实现,可以实现对蓝牙小车的远程控制和操作。 ### 回答3: 基于C语言的蓝牙小车代码可以分为三个部分:蓝牙控制模块、小车控制模块和主程序模块。 蓝牙控制模块主要用于与蓝牙模块进行通信,接收和发送指令。可以使用UART通信协议对蓝牙模块进行初始化,并设置波特率和数据位。通过读取接收缓冲区的数据,可以获得蓝牙发送的指令。 小车控制模块主要用于控制车轮的转动,根据接收到的指令进行相应的动作。可以使用GPIO控制器来设置各个引脚的输入输出模式,并使用PWM信号控制电机的转速。根据接收到的指令,可以调整电机的转向和速度。例如,当接收到前进指令时,可以设置两个车轮向前旋转,以实现小车的前进动作。 主程序模块则集成了蓝牙控制模块和小车控制模块,实现整个程序的流程控制。主程序首先初始化各个模块,然后进入一个循环,不断接收蓝牙发送的指令。当接收到指令后,主程序根据指令调用小车控制模块的相应函数,对小车进行控制。通过不断循环,实现了小车的持续控制。 以上是关于基于C语言的蓝牙小车代码的简要描述。实际上,具体的实现过程可能会更加复杂,因为需要考虑到蓝牙通信的稳定性和小车控制的精确性等问题。但总的来说,这个代码可以作为一个基础的框架,用于实现蓝牙小车的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值