点击上方“嵌入式应用研究院”,选择“置顶/星标公众号

干货福利,第一时间送达!

排版 | 嵌入式应用研究院

素材来源 |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 failed\r\n");
    }  
    //...
  • 加入定时轮询任务

/**
 * @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:%d\r\n", rssi, ber);
        }
    } else {
        printf("'CSQ' command response failed!\r\n");
    }
}  
/**
 * @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)

wifi

五、如何获取

您可以在GitHub上访问at-client-cmd项目,获取详细的文档和源码。该项目遵循Apache-2.0开源许可证,欢迎广大开发者参与贡献。

https://github.com/zhbi98/at-client-cmd
六、结语

AT 指令作为设备通信的标准方式,就像一座桥梁,连接着不同的设备,被广泛应用于 Modem、Wi-Fi 模块、蓝牙等场景。然而,如何高效管理这些 AT 指令的通信交互,始终是开发者面临的挑战。就好比在繁忙的交通枢纽,如何合理调度车辆,确保交通顺畅,是一个复杂而又关键的问题。at-client-cmd组件为开发者提供了一个高效、灵活的AT指令通信管理方案。无论是在有操作系统还是无操作系统的环境下,它都能助您轻松实现设备间的通信交互,加速产品开发进程。

往期精彩

推荐一个嵌入式 RPC 通信框架-eRPC

基于观察者模式设计的框架-REB,使代码模块化

一个综合性非常强的Qt+STM32上下位机嵌入式毕设项目

开源项目-这个基于STM32开源的DIY炫酷智能手表你值得拥有!

Linux下日志管理神器Logrotate:如何让日志文件智能裁剪和压缩?

从小白到高手:嵌入式软件开发时序图全解析,秒懂电平与时间的关系

觉得本次分享的文章对您有帮助,随手点[在看]并转发分享,也是对我的支持。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐