產品很多配置信息需要后期進行配置,配置交互最好的方式之一是上位機通過串口與開發(fā)板進行交互來完配置。這里我準備引入AT指令來進行配置。
我采用串口中斷+定時器中斷來實現了串口的接收,下面進行AT指令框架的創(chuàng)建。
- 首先定義了指令結構:
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; /* 指令執(zhí)行 */
}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}
};
- 我定義了執(zhí)行指令的函數1個是AT測試,再有一條是設置RTC的指令(具體還沒有實現,只是定義了一條打印指令);
/* 指令執(zhí)行函數 */
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;
}
- 最后我們進行指令解析,主要有兩個函數,一個是檢索指令表里是否存在指令,二個是解析指令,如果成果測執(zhí)行相應的指令。
/* 查找指令表中對應的指令 */
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); /* 執(zhí)行測試指令 */
}
}else if(p[2] == '+') { /* 執(zhí)行指令解析 */
index = AT_cmd_search(p, len); /* 查找匹配的執(zhí)行指令, 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); /* 執(zhí)行對應的指令函數, p+n:將指令參數傳輸執(zhí)行函數,len-n-2:指令參數有效長度 */
}else {
ret = AT_ERR_FUN_UNUSED; /* 沒有可執(zhí)行函數 */
}
}else {
ret = AT_ERR_UNINVAL; /* 未找到匹配的指令 */
}
}else { /* 格式不匹配 */
return AT_ERR;
}
return ret;
}
}
【測試】
我在接收到指令后執(zhí)行at_cmd_parse 發(fā)送AT、AT+SETRTC=成功的返回需要的信息。
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。
舉報投訴
-
指令
+關注
關注
1文章
608瀏覽量
35768 -
串口
+關注
關注
14文章
1557瀏覽量
76711 -
開發(fā)板
+關注
關注
25文章
5087瀏覽量
97785 -
上位機
+關注
關注
27文章
944瀏覽量
54903 -
CW32
+關注
關注
1文章
210瀏覽量
699
發(fā)布評論請先 登錄
相關推薦
CW32L010demo
硬件原理圖:主芯片
引腳封裝圖:
CW32L010 是基于 eFlash 的單芯片低功耗微控制器,集成了主頻高達 48MHz 的 ARM? Cortex?-M0+ 內核、高速嵌入式存儲器(多至
發(fā)表于 12-25 17:41
方案介紹|CW32L010安全低功耗MCU:驅動高速風筒新力量
芯源半導體CW32L010系列MCU可支持低成本、高性能、低功耗、高度集成的高速風筒方案,以滿足市場對高效、安全、智能的高速風筒需求。
本文將介紹武漢芯源半導體CW32L010系列單片機在高速風筒
發(fā)表于 12-10 09:57
【CW32L010 Mini Board 測評】簡介、點燈
【CW32L010 Mini Board 測評】簡介、點燈
CW32L010 Mini Board 是 武漢芯源半導體 設計的基于 CW32L010 的開發(fā)板,
簡介
CW32L01
發(fā)表于 11-17 06:39
CW32L010 新品初體驗
最近我們迎來了CW32L010新品的正式發(fā)布,標志著嵌入式技術領域的又一次創(chuàng)新突破。今日,我們有幸進行該新品的首次使用體驗,以一塊L010核心板為例,體驗一下這顆芯片。 一、核心板概覽 如圖所示
CW32L0100核心板的使用體驗
最近我們迎來了CW32L010新品的正式發(fā)布,標志著嵌入式技術領域的又一次創(chuàng)新突破。今日,我們有幸進行該新品的首次使用體驗,以一塊L010核心板為例,體驗一下這顆芯片。
CW32L010安全低功耗MCU,樹立M0+產品行業(yè)新標桿!
。
CW32L010系列產品可以阻止這個入侵,我們允許用戶劃定一塊指令存儲區(qū)域,只能通過指令總線取指令執(zhí)行,不允許通過數據總線訪問數據。在這個區(qū)域內,即使攻擊者嘗試通過下載間諜程序挾持
發(fā)表于 10-09 10:08
CW32L083 IAP跳轉后中斷無響應是怎么回事?
最近做一個項目,需要IAP。按照官方的教程一切順利,軟件APP跳轉一切正常,但是跳轉后中斷沒有響應。搜索了一堆資料,APP在mian中找開了中斷,在不同地方設置VROT,都沒能解決,查了數據手冊,也只說支持向量偏移,沒有其它介紹。請問哪位大神做過IAP中斷處理的,指點一下,是不是還需要設置哪里。我用仿真器測試,只要是帶中斷的,跳轉后,中斷全部無響應。
發(fā)表于 07-26 07:17
請問STM32L083的唯一ID為什么有重復?。?/a>
ID的讀取代碼如下:
for(i=0; i<3; i++)
{//STM32L083 ID CODE
STM32L083_ID[i] = *(uint32_t
發(fā)表于 04-17 06:29
CW32L052 FLASH存儲器
CW32L052內部集成了64KB嵌入式FLASH供用戶使用,可用來存儲應用程序和用戶數據。芯片支持對 FLASH 存儲器的讀、擦除和寫操作,支持擦寫保護和讀保護。芯片內置 FLASH 編程所需的高壓 BOOST 電路,無須額外提供編程電壓。
CW32L052單片機支持DMA實現高速數據傳輸
CW32L052支持DMA(Direct Memory Access),即直接內存訪問,無需CPU干預,實現高速數據傳輸。
評論