0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于CW32L083的AT指令框架

华仔的编程随笔 来源:华仔的编程随笔 作者:华仔的编程随笔 2023-07-13 08:57 次阅读

产品很多配置信息需要后期进行配置,配置交互最好的方式之一是上位机通过串口与开发板进行交互来完配置。这里我准备引入AT指令来进行配置。

我采用串口中断+定时器中断来实现了串口的接收,下面进行AT指令框架的创建。

  1. 首先定义了指令结构:
typedef enum{
    AT_CMD_TEST = 0,
    AT_CMD_SETRTC,
    AT_END
}AT_Cmd;

typedef unsigned char (*pFunc)(unsigned char *ptr, unsigned char len);

typedef struct
{
    AT_Cmd cmd;             /* 指令序号 */
    unsigned char *str;     /* 指令内容 */
    pFunc cb;               /* 指令执行 */
}AT_cmd_func;

/* AT指令表 */
const AT_cmd_func at_cmd_func[] = {
    {AT_CMD_TEST,       "AT",           at_cmd_test},
    {AT_CMD_SETRTC,     "AT+SETRTC=",   at_cmd_setrtc},
    {AT_END,        NULL,           NULL}
};
  1. 我定义了执行指令的函数1个是AT测试,再有一条是设置RTC的指令(具体还没有实现,只是定义了一条打印指令);
/* 指令执行函数 */
unsigned char at_cmd_test(unsigned char *p, unsigned char len){
    AT_DEBUG_INFO("AT+OKrn");
    return 0;
}

unsigned char at_cmd_setrtc(unsigned char *p, unsigned char len){
    AT_DEBUG_INFO("setrtcrn");
    return 0;
}
  1. 最后我们进行指令解析,主要有两个函数,一个是检索指令表里是否存在指令,二个是解析指令,如果成果测执行相应的指令。
/* 查找指令表中对应的指令 */
unsigned char AT_cmd_search(unsigned char *p, unsigned char len)
{
    unsigned char ret = 0;
    unsigned char *pstr;
    unsigned char i, n;
    for(i=1; at_cmd_func[i].cmd != AT_END; i++)
    {
        n = mstrlen(at_cmd_func[i].str);
        if(!mstrncmp(p, at_cmd_func[i].str, n)){
            ret = i;
            break;
        }
    }
    return ret;
}

/* AT指令解析 */
unsigned char at_cmd_parse(unsigned char *p, unsigned char len){
    unsigned char ret = AT_SUCCESS;
    unsigned char index = 0;
    unsigned char n;
    if(len < 4) {
        return AT_ERR;
    }

    if((p[0] == 'A') && (p[1] == 'T') && (p[len-2] == 0x0D) && (p[len-1] == 0x0A)) {
        if(len == 4) { /* 测试指令 */
            if(at_cmd_func[AT_CMD_TEST].cb != NULL) {
                at_cmd_func[AT_CMD_TEST].cb(NULL, 0); /* 执行测试指令 */
            }
        }else if(p[2] == '+') { /* 执行指令解析 */
                index = AT_cmd_search(p, len); /* 查找匹配的执行指令, 0-已匹配, !0-未匹配*/
                if(index) {
                    if(at_cmd_func[index].cb != NULL) {
                        n = mstrlen(at_cmd_func[index].str);
                        ret = at_cmd_func[index].cb(p+n, len-n); /* 执行对应的指令函数, p+n:将指令参数传输执行函数,len-n-2:指令参数有效长度 */ 
                    }else {
                        ret = AT_ERR_FUN_UNUSED; /* 没有可执行函数 */
                    }
                }else {
                    ret = AT_ERR_UNINVAL; /* 未找到匹配的指令 */
                }
        }else { /* 格式不匹配 */
            return AT_ERR; 
        }
        return ret;
    }

}

【测试】

我在接收到指令后执行at_cmd_parse 发送AT、AT+SETRTC=成功的返回需要的信息。

image.png

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 指令
    +关注

    关注

    1

    文章

    579

    浏览量

    35375
  • 串口
    +关注

    关注

    14

    文章

    1483

    浏览量

    74511
  • 开发板
    +关注

    关注

    25

    文章

    4429

    浏览量

    93991
  • 上位机
    +关注

    关注

    26

    文章

    861

    浏览量

    54044
  • CW32
    +关注

    关注

    1

    文章

    122

    浏览量

    225
收藏 人收藏

    评论

    相关推荐

    请问如何优化CW32L083微控制器的功耗?

    在进行低功耗设计时,如何优化CW32L083系列微控制器的功耗?
    发表于 01-17 07:16

    CW32L083系列微控制器的ADC和DAC模块要如何使用?怎么配置?

    如何配置和使用CW32L083系列微控制器的ADC和DAC模块?
    发表于 01-17 06:08

    CW32L083如何实现AUTOTRIM时钟校准?

    CW32L083如何实现AUTOTRIM时钟校准?
    的头像 发表于 11-07 17:17 256次阅读
    <b class='flag-5'>CW32L083</b>如何实现AUTOTRIM时钟校准?

    CW32L083的UART单线半双工模式介绍

    CW32L083的UART单线半双工模式介绍
    的头像 发表于 10-24 17:49 463次阅读
    <b class='flag-5'>CW32L083</b>的UART单线半双工模式介绍

    CW32L083 StartKit软件包分享

    CW32L083 StartKit软件包
    发表于 09-15 07:00

    CW32L083用户手册

    CW32L083核心是32位ARM®Cortex®-M0+微处理器,最大寻址空间为4GB。芯片的内置程序存储器、数据存储器、外围设备和端口寄存器是统一的在相同的4GB线性地址空间中寻址。 内存中
    发表于 09-14 07:02

    CW32L083产品介绍

    CW32L083是一款基于eFlash的单芯片低功耗微控制器,集成了ARM®Cortex®-M0+ 核心,主频高达64MHz,高速嵌入式存储器(高达256K字节的FLASH和 高达24K字节
    发表于 09-14 06:41

    CW32L083微控制器数据手册

    CW32L083 是基于 eFlash 的单芯片低功耗微控制器,集成了主频高达 64MHz 的 ARM® Cortex®-M0+ 内核、高速嵌入式存储器(多至 256K 字节 FLASH 和多至
    发表于 09-14 06:27

    基于CW32L083评估板的简易低功耗功能测试

    使用CW32L083的评估板完成简易低功耗例程实验。
    的头像 发表于 08-28 14:16 401次阅读
    基于<b class='flag-5'>CW32L083</b>评估板的简易低功耗功能测试

    CW32L083移植驱动st7735 TFT屏

    CW32L083上驱动ST7735屏
    的头像 发表于 07-04 19:16 1019次阅读
    <b class='flag-5'>CW32L083</b>移植驱动st7735 TFT屏

    基于CW32L083的线控器方案设计

    基于武汉芯源推出的CW32L083设计的空调线控器产品.
    的头像 发表于 06-25 14:23 1.1w次阅读
    基于<b class='flag-5'>CW32L083</b>的线控器方案设计

    CW32L083 RTC初始化设置

    介绍CW32L083的RTC初始化设置
    的头像 发表于 06-24 10:16 971次阅读
    <b class='flag-5'>CW32L083</b> RTC初始化设置

    CW32L083实现SHT30驱动

    CW32L083驱动SHT30,并显示到LCD屏上。
    的头像 发表于 06-22 09:57 2388次阅读
    <b class='flag-5'>CW32L083</b>实现SHT30驱动

    CW32L083段码屏驱动

    CW32L083开发板上有8个段码LCD显示,使其显示为0-9数字。
    的头像 发表于 06-18 09:13 18w次阅读
    <b class='flag-5'>CW32L083</b>段码屏驱动

    CW32L083 I2C主板发送编程示例

    CW32L083的I2C主机发送示例。
    的头像 发表于 06-09 16:54 17.9w次阅读