素材来源 |Github开源社区
在当今物联网(IoT)高速发展的时代,设备之间的高效通信成为了关键。AT指令作为设备通信的标准方式,被广泛应用于Modem、Wi-Fi模块、蓝牙等场景。然而,如何高效管理这些AT指令的通信交互,始终是开发者面临的挑战。为此,GitHub上的开源项目at-client-cmd应运而生,为开发者提供了一个强大而灵活的解决方案。
一、项目概述
at-client-cmd是一款用于管理AT指令通信交互的组件,适用于Modem、Wi-Fi模块、蓝牙等需要使用AT指令或ASCII命令行通信的场景。它涵盖了大部分AT通信形式,如参数设置、查询、二进制数据发送等,同时支持自定义命令的交互管理。由于每个命令请求都是异步的,因此即使在无操作系统的环境下也能良好运行。相较于V1版本,新版本在命令接收匹配、URC不定长度数据捕获以及内存安全上进行了大量优化,使其能够应对更复杂的产品应用。
二、主要特性
- 异步命令请求:所有命令请求均为异步,无操作系统也可运行。多样化命令支持:支持单行命令、批量命令、可变参数命令以及自定义AT命令。完善的错误处理机制:支持命令响应超时、错误重传和优先级管理。URC消息捕获:支持不定长度URC(未经请求主动上报)消息的捕获。多设备管理:支持多个AT设备的通信管理。内存监控:支持内存使用监视与限制。命令生命周期管理:支持命令请求的生命周期管理,实时监视命令执行状态。命令透传:支持命令透传功能。
三、系统要求
为了确保AT指令的正常通信,目标系统需满足以下要求:
- 动态内存支持。RAM资源:至少1KB(取决于接收缓冲区与URC缓冲区的设置),建议在可分配3KB以上内存的系统中使用。编译器:系统使用了一些C99的特性(如柔性数组、内联),因此编译器需开启对C99的支持。对于IAR、GCC,它们默认是开启的,而Keil MDK需要手动增加编译选项(--c99 --gnu)。
四、版本及其使用说明
相较于V1版本,V2版本主要针对“at_chat”模块进行了整体优化,支持URC功能,同时加强了对操作系统环境的支持。由于采用动态内存方式管理AT命令请求,对RAM资源的要求更高,但使用上更加便捷。下面简单介绍下如何使用(参考:https://github.com/zhbi98/at-client-cmd/tree/main):
定义适配器,完成驱动接口及缓冲区设置
/**
* @brief AT适配器
*/
static const at_adapter_t at_adapter = {
.lock = at_mutex_lock, //多任务上锁(非OS下填NULL)
.unlock = at_mutex_unlock, //多任务解锁(非OS下填NULL)
.write = at_device_write, //串口数据写接口(非阻塞式)
.read = at_device_read, //串口数据读接口(非阻塞式)
.debug = at_debug, //调试打印接口(不需要则填NULL)
.recv_bufsize = 256 //接收缓冲区大小(按实际情况填写)
};
使用AT适配器创建AT通信对象
at_obj_t *at_obj;
//....
at_obj = at_obj_create(&at_adapter);
if (at_obj == NULL) {
printf("at object create failedrn");
}
//...
加入定时轮询任务
/**
* @brief 轮询程序
*/
void at_device_process(void)
{
static unsigned int timer;
//为了加快AT命令处理响应速度,建议5ms以内轮询一次
if (get_tick() - timer > 5) {
timer = get_tick();
at_obj_process(&at_obj);
}
}
发送AT命令
完成上面几个步骤之后,就可以执行AT命令请求了,下面以查询MODEM信号质量为例,演示如何发送AT命令及解析响应内容.
命令格式如下:
=> AT+CSQ
<= +CSQ: <rssi>,<ber>
<= OK
代码实现:
/**
* @brief 命令响应处理程序
*/
static void csq_respose_callback(at_response_t *r)
{
int rssi, ber;
//+CSQ: <rssi>,<ber>
if (r->code == AT_RESP_OK) {
//命令响应成功后,解析出rssi,ber.
if (sscanf(r->prefix, "+CSQ:%d,%d", &rssi, &ber) == 2) {
printf("rssi:%d, ber:%drn", rssi, ber);
}
} else {
printf("'CSQ' command response failed!rn");
}
}
/**
* @brief 读CSQ值请求
*/
static void read_csq(void)
{
//发送命令,超时时间为1000ms,重发次数为0
at_send_singlline(at_obj, csq_respose_callback, 1000, 0, "AT+CSQ");
}
下面是在M169 WIFI上运行的效果图(例子:at_chat/samples/none_os)
五、如何获取
您可以在GitHub上访问at-client-cmd项目,获取详细的文档和源码。该项目遵循Apache-2.0开源许可证,欢迎广大开发者参与贡献。
https://github.com/zhbi98/at-client-cmd
六、结语
AT 指令作为设备通信的标准方式,就像一座桥梁,连接着不同的设备,被广泛应用于 Modem、Wi-Fi 模块、蓝牙等场景。然而,如何高效管理这些 AT 指令的通信交互,始终是开发者面临的挑战。就好比在繁忙的交通枢纽,如何合理调度车辆,确保交通顺畅,是一个复杂而又关键的问题。at-client-cmd组件为开发者提供了一个高效、灵活的AT指令通信管理方案。无论是在有操作系统还是无操作系统的环境下,它都能助您轻松实现设备间的通信交互,加速产品开发进程。