产品很多配置信息需要后期进行配置,配置交互最好的方式之一是上位机通过串口与开发板进行交互来完配置。这里我准备引入AT指令来进行配置。
我采用串口中断+定时器中断来实现了串口的接收,下面进行AT指令框架的创建。
- 首先定义了指令结构:
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个是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;
}
- 最后我们进行指令解析,主要有两个函数,一个是检索指令表里是否存在指令,二个是解析指令,如果成果测执行相应的指令。
/* 查找指令表中对应的指令 */
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=成功的返回需要的信息。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
指令
+关注
关注
1文章
617浏览量
37300 -
串口
+关注
关注
15文章
1607浏览量
81941 -
开发板
+关注
关注
25文章
6124浏览量
113355 -
上位机
+关注
关注
27文章
994浏览量
56713 -
CW32
+关注
关注
1文章
281浏览量
1677
发布评论请先 登录
相关推荐
热点推荐
CW32W031射频芯片的AT指令都有哪些功能?
我在网上看到一个,基于CW32W031射频芯片的AT指令无线串口模块,这个模块是官方开源的吗?有源码吗?还有这个AT指令都支持啥功能?
发表于 12-05 07:27
CW32单片机在智能马桶的应用
电池的使用寿命。例如,降低加热功率或减少冲洗时间等,通过智能的电量管理,实现了对电能的高效利用和节约。
这款智能马桶采用的是武汉芯源半导体32位低功耗CW32L083系列,该系列产品集成了主频高达
发表于 12-04 08:01
CW32定时器及中断介绍
以CW32L083为例,其定时器分为6种:
基本定时器:CW32L083 内部集成 3 个基本定时器 (BTIM),每个 BTIM 完全独立且功能完全相同,各包含一个 16bit 自动重装
发表于 12-01 07:08
GCC开发工程的模版
1、拷贝一份工程,另存为cw32l083_gcc,并用vscode打开。
2、到官网下载cw32l083的固件库。
3、把cw32l083-stdperiph-lib/Libraries下面的固件
发表于 11-28 08:15
CW32L010的串口输出
CW32L010是一款集成了丰富功能的低功耗微控制器,其串口输出功能是通过其内部的通用异步收发器(UART)实现的。
一、串口硬件资源
CW32L010提供了二路低功耗UART,这些UART接口支持
发表于 11-27 07:27
pwm关闭后,有杂波怎么解决?
使用cw32l083的芯片,用GTIM3-CH3,PA11输出38K的pwm发送红外信号,使能定时器后,即使占空比设为0,也会输出杂波,或者关闭定时器,也会有杂波,大概要怎么配置呢?
发表于 11-24 07:08
CW32单片机UART低功耗模式的介绍
,往往是靠电池来供电,所以设计人员从每一个细节来考虑降低功率消耗,从而尽可能地延长电池使用时间。因此,大部分芯片都会有低功耗模式,以CW32L083为例,它就是一个32位低功耗微控制器。
一、芯片模式
发表于 11-19 06:08
CW32 UART低功耗模式详解
,往往是靠电池来供电,所以设计人员从每一个细节来考虑降低功率消耗,从而尽可能地延长电池使用时间。因此,大部分芯片都会有低功耗模式,以CW32L083为例,它就是一个32位低功耗微控制器。
一、芯片模式
发表于 11-12 07:24
CW32 MCU的工作电压、工作温度是多少?
32F003、CW32F002等,其工作温度为-40℃~105℃,其余系列,比如:CW32L083、CW32L031等低功耗系列,以及CW32R、C
发表于 11-12 06:49
CW32 MCU最低功耗能做到多少?
CW32L系列,比如:CW32L083、CW32L031在深度休眠模式下,电流可低至600nA以下,CW32L010则可低至0.3uA;其它系列,比如:
发表于 11-12 06:24
CW32L01x系列MCU驱动TFT屏的应用方案
CW32L01x系列MCU应用广泛,本文将详细介绍CW32L01x系列MCU驱动TFT屏的应用方案。我们以CW32L010系列MCU为例来介绍一下硬件连接要点和软件驱动关键步骤。

基于CW32L083的AT指令框架
评论