产品很多配置信息需要后期进行配置,配置交互最好的方式之一是上位机通过串口与开发板进行交互来完配置。这里我准备引入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文章
607浏览量
35689 -
串口
+关注
关注
14文章
1550浏览量
76396 -
开发板
+关注
关注
25文章
5024浏览量
97349 -
上位机
+关注
关注
27文章
941浏览量
54785 -
CW32
+关注
关注
1文章
203浏览量
618
发布评论请先 登录
相关推荐
方案介绍|CW32L010安全低功耗MCU:驱动高速风筒新力量
芯源半导体CW32L010系列MCU可支持低成本、高性能、低功耗、高度集成的高速风筒方案,以满足市场对高效、安全、智能的高速风筒需求。
本文将介绍武汉芯源半导体CW32L010系列单片机在高速风筒
发表于 12-10 09:57
【CW32L010 Mini Board 测评】简介、点灯
【CW32L010 Mini Board 测评】简介、点灯
CW32L010 Mini Board 是 武汉芯源半导体 设计的基于 CW32L010 的开发板,
简介
CW32L01
发表于 11-17 06:39
CW32L010 新品初体验
最近我们迎来了CW32L010新品的正式发布,标志着嵌入式威廉希尔官方网站
领域的又一次创新突破。今日,我们有幸进行该新品的首次使用体验,以一块L010核心板为例,体验一下这颗芯片。 一、核心板概览 如图所示
CW32L0100核心板的使用体验
最近我们迎来了CW32L010新品的正式发布,标志着嵌入式威廉希尔官方网站
领域的又一次创新突破。今日,我们有幸进行该新品的首次使用体验,以一块L010核心板为例,体验一下这颗芯片。
CW32L010安全低功耗MCU,树立M0+产品行业新标杆!
。
CW32L010系列产品可以阻止这个入侵,我们允许用户划定一块指令存储区域,只能通过指令总线取指令执行,不允许通过数据总线访问数据。在这个区域内,即使攻击者尝试通过下载间谍程序挟持
发表于 10-09 10:08
CW32L083 IAP跳转后中断无响应是怎么回事?
最近做一个项目,需要IAP。按照官方的教程一切顺利,软件APP跳转一切正常,但是跳转后中断没有响应。搜索了一堆资料,APP在mian中找开了中断,在不同地方设置VROT,都没能解决,查了数据手册,也只说支持向量偏移,没有其它介绍。请问哪位大神做过IAP中断处理的,指点一下,是不是还需要设置哪里。我用仿真器测试,只要是带中断的,跳转后,中断全部无响应。
发表于 07-26 07:17
请问STM32L083的唯一ID为什么有重复啊?
ID的读取代码如下:
for(i=0; i<3; i++)
{//STM32L083 ID CODE
STM32L083_ID[i] = *(uint32_t
发表于 04-17 06:29
CW32L052 FLASH存储器
CW32L052内部集成了64KB嵌入式FLASH供用户使用,可用来存储应用程序和用户数据。芯片支持对 FLASH 存储器的读、擦除和写操作,支持擦写保护和读保护。芯片内置 FLASH 编程所需的高压 BOOST 电路,无须额外提供编程电压。
CW32L052单片机支持DMA实现高速数据传输
CW32L052支持DMA(Direct Memory Access),即直接内存访问,无需CPU干预,实现高速数据传输。
基于CW32W031射频芯片的AT指令无线串口模块
1.模块介绍 1.1实物图片 外接天线 模块正面 1.2模块概述 该模块是基于武汉芯源半导体 CW32W031 射频芯片研发的AT 指令无线串口模块。可使用串口进行数据收发,降低无线应用门槛;可配
CW32单片机在智能马桶的应用介绍
对电能的高效利用和节约。
这款智能马桶采用的是武汉芯源半导体32位低功耗CW32L083系列,该系列产品集成了主频高达64MHz的ARM® Cortex®-M0+ 内核、最多256KB FLASH 、最多
发表于 12-20 10:06
评论