• 正文
  • 相关推荐
申请入驻 产业图谱

嵌入式优质项目分享-一个基于C语言的AT客户端命令通信交互组件的设计与实现

02/08 11:00 来源:嵌入式应用研究院
965
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

素材来源 |Github开源社区

在当今物联网(IoT)高速发展的时代,设备之间的高效通信成为了关键。AT指令作为设备通信的标准方式,被广泛应用于ModemWi-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指令通信管理方案。无论是在有操作系统还是无操作系统的环境下,它都能助您轻松实现设备间的通信交互,加速产品开发进程。

点赞
收藏
评论
分享
加入交流群
举报

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录

本科毕业于华南理工大学,现美国卡罗尔工商管理硕士研究生在读,曾就职于世界名企伟易达、联发科技等,多年嵌入式产品开发经验,在智能玩具、安防产品、平板电脑、手机开发有丰富的实战开发经验,现任深圳市云之手科技有限公司副总经理、研发总工程师。