首页 > 其他分享 >MCU向CH9141发送AT指令

MCU向CH9141发送AT指令

时间:2023-05-12 14:33:45浏览次数:45  
标签:STD MACRO CH9141 TxBuff 指令 MCU 9141 ATCMD s%

沁恒的BLE模块CH914x系列中,CH9141和CH9343支持通过UART串口识别AT指令。注意CH9140不支持AT指令。使用电脑作为上位机时,各类串口助手可以提供保存和发送自定义字符串的功能,不过很多应用场景下都是通过板子上另一片MCU来为BLE透传模块配置AT指令。以下提供帮助MCU快速使用9141和9143。

本文以CH9141手册中的AT命令为准,整理一份二维数组,可按需增补删改。

const uint8_t ATCMD_STD[4][4] = {           //标准指令前后缀
"AT+",
"?\r\n",
"=",
"\r\n",
};


const uint8_t ATCMD_9141[52][10] = {        //51条指令
"",
"AT...",    //序号1      //进AT配置模式
"RESET",
"VER",                  //获取芯片版本号
"HELLO",
"RELOAD",   //序号5
"SHOW",
"SAVE",
"EXIT",                 //退出AT配置模式
"GPIO",
"INITIO",   //序号10
"UART",
"MAC",
"TPL",
"BLESTA",
"DISCONN",         //序号15
"BLEMODE",
"CCADD",
"NAME",
"PNAME",
"PASEN",         //序号20
"PASS",
"SYSID",
"MODNAME",
"SERINUM",
"FIRMREV",         //序号25
"HARDREV",
"SOFTREV",
"MANUNAME",
"PNPID",
"ADVEN",         //序号30
"ADVDAT",
"LINK",
"CONN",
"SCAN",
"CONADD",       //序号35
"CLRCONADD",
"RSSI",
"ADC",
"SLEEP",
"BAT",          //序号40
"BDSP",
"BLECFGEN",
"BCCH",
"ADVINTER",
"CONNINTER",    //序号45
"LSICALI",
"RFCALI",
"TNOW",
"BSTA",
"AFEC",             //序号50
"IOEN",
};

当然也可以把“AT+”放在ATCMD_9141[]数组中,不过数组的大小就要配置为52x13,多占用一百多个字节。

在发出指令前,可以利用sprintf库函数,将多个字符串按顺序拼接到一起。调用strcat或其他函数做拼接均可,不过考虑到sprintf可以将十进制数据添加到字符串中,还是使用sprintf好了。

将三串字符串拼接到TxBuff中,再通过打印函数或者串口输出,可以得到期望的字符串,最后清空一下TxBuff以便下次使用:

        sprintf(TxBuff, "%s%s%s", ATCMD_STD[0], ATCMD_9141[8], ATCMD_STD[3]);  
        PRINT("%s", TxBuff);                                
        memset(TxBuff, 0, sizeof(TxBuff));                  

为了方便使用,可以再封装一层宏定义,调用起来更方便。

//PRINT()即printf()
#define ENTER_AT_CFG  \
{    \
        sprintf(TxBuff, "%s%s", ATCMD_9141[1], ATCMD_STD[3]);  \
        PRINT("%s", TxBuff);                                \
        memset(TxBuff, 0, sizeof(TxBuff));                  \
}   //进入AT配置模式

#define EXIT_AT_CFG  \
{    \
        sprintf(TxBuff, "%s%s%s", ATCMD_STD[0], ATCMD_9141[8], ATCMD_STD[3]);  \
        PRINT("%s", TxBuff);                                \
        memset(TxBuff, 0, sizeof(TxBuff));                  \
}   //退出AT配置模式

#define COMMAND_AT(MACRO_X)  \
{    \
        sprintf(TxBuff, "%s%s%s", ATCMD_STD[0], (MACRO_X), ATCMD_STD[3]);  \
        PRINT("%s", TxBuff);                                \
        memset(TxBuff, 0, sizeof(TxBuff));                  \
}   //不带问号(即AT+X?格式),不带配置参数(即AT+X=n格式)的指令

#define QUERY_AT(MACRO_X)  \
{    \
        sprintf(TxBuff, "%s%s%s", ATCMD_STD[0], (MACRO_X), ATCMD_STD[1]);  \
        PRINT("%s", TxBuff);                                \
        memset(TxBuff, 0, sizeof(TxBuff));                  \
}   //带问号的查询指令

#define SET_STR_AT(MACRO_X1, MACRO_X2)  \
{    \
        sprintf(TxBuff, "%s%s%s%s%s", ATCMD_STD[0], (MACRO_X1), ATCMD_STD[2], (MACRO_X2), ATCMD_STD[3]);  \
        PRINT("%s", TxBuff);                                \
        memset(TxBuff, 0, sizeof(TxBuff));                  \
}   //需要配置字符串的命令,比如开/关广播、设置厂商名称等指令

#define SET_NUM_AT(MACRO_X1, MACRO_X2)  \
{    \
        sprintf(TxBuff, "%s%s%s%d%s", ATCMD_STD[0], (MACRO_X1), ATCMD_STD[2], (MACRO_X2), ATCMD_STD[3]);  \
        PRINT("%s", TxBuff);                                \
        memset(TxBuff, 0, sizeof(TxBuff));                  \
}   //需要配置十进制数字的命令,比如设置发射功率等指令


/*以下为函数中的调用代码*/
    ENTER_AT_CFG;
    DelayMs(500);

    COMMAND_AT(ATCMD_9141[3]);
    DelayMs(500);

    QUERY_AT(ATCMD_9141[4]);
    DelayMs(500);

    SET_STR_AT(ATCMD_9141[30], "OFF");
    DelayMs(500);

    SET_NUM_AT(ATCMD_9141[13], 3);
    DelayMs(500);

    EXIT_AT_CFG;
    DelayMs(500);

标签:STD,MACRO,CH9141,TxBuff,指令,MCU,9141,ATCMD,s%
From: https://www.cnblogs.com/JayWellsBlog/p/16944699.html

相关文章

  • vue dom拖拽指令
    还可以封装一下代码,不想封了,移动端pc端区别:事件不同,pc端鼠标事件移动端触摸事件;pc端直接获取e.pageX,移动端e.changedTouches[0].pageX使用直接在dom绑定v-dragdirectives:{drag(el,bindings,vnode){letphone=falseletmax=max||0if(wi......
  • docker 常用指令
    dockerload-i./power.tar 恢复镜像dockerps  列出所有正在运行容器信息dockerps-a  列出所有容器信息dockerimages 列出所有镜像dockerrun-it--name名称-p8196:80(端口映射) -e SQL_User=‘数据库用户名‘ -e SQL_Pass='数据库密码'-eSQL_Db_N......
  • 指令记录
     readlf:可对可执行、库文件等elf文件进行分析,使用方式见 https://blog.csdn.net/wangbaochu/article/details/41548549ll:指令可显示当前路径下的文件和链接关系......
  • .Net Core 4. VS2022 + Core6.0 + Razor 设置model特性改变显示的属性名称,通过@page指
    通过Model的特性修改显示的内容/规则目前在Index页面上,显示的表头都是model的字段名,在实际项目中通常不会这么做,这里我们修改一下Model部分来让表头显示的更加直观。1.引入System.ComponentModel.DataAnnotations.Schema,也可以事后根据提示自动添加。2.[Display(Na......
  • 部署前端到(NG)常用指令
    1.构建压缩#bash#构建pnpmrunbuild#压缩产物tar-czvfdist.tar.gzdist/2.登录并上传资源到服务#shell#上传静态资源。xxx替换为实际服务地址,根据实际路径定义。[email protected]:/data/web/tmp#提示输入服务密码,输入即可。3.登录服务......
  • ChatGPT 中文指令指南,教会你如何使用chatgpt实现中文你想要的答案
    ......
  • C语言快速入门教程1快速入门 2指令 3条件选择
    快速入门什么是C语言?C是一种编程语言,1972年由DennisRitchie在美国AT&T的贝尔实验室开发。C语言变得很流行,因为它很简单,很容易使用。今天经常听到的一个观点是--"C语言已经被C++、Python和Java等语言所取代,所以今天何必再去学习C语言"。我很不赞同这种观点。这有几个原因。这......
  • 【内存分析】用于内存分析定位的指令 jmap, jstat, jinfo, jstack
    用于内存分析定位的指令/工具有:jmap,jstat,jinfo,jstackjmap(1)分析进程中的内存使用情况,是多少个什么样的对象占用了多大的内存,这类型的分析(2)也可以导出堆转储文件,导出后,再来分析jstack这个是看cpu的,看各个线程的执行状态,如果cpu比较高,就是用jstack来定位分析......
  • 若依--自定义指令 v-hasPermi 和 v-hasRole
    为什么大家都在用若依?若依版本有很多种,前端的,后端的,大家点击去看看http://doc.ruoyi.vip/,看完记得回来!第一次接触到若依是进入这家公司之后,以前做项目都是“白手起家”,若依项目结构清晰,很多轮子都被造好了,不用自己搭建项目,gitclone就完成了,happy!还有项目文档可以查看,虽然我......
  • CMake重要指令
    1语法特性介绍基本语法格式——指令(参数1参数2)参数使用括弧括起来;参数之间使用空格或者分号隔开;set(HELLOhello.cpp)add_executable(hellomain.cpphello.cpp)ADD_EXECUTABLE(hellomain.cpp${HELLO})变量使用${}方式取值,但是在IF控制语句中是直接使用变......