<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
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

    文章

    580

    瀏覽量

    35413
  • 串口
    +關注

    關注

    14

    文章

    1501

    瀏覽量

    74695
  • 開發板
    +關注

    關注

    25

    文章

    4560

    瀏覽量

    94883
  • 上位機
    +關注

    關注

    26

    文章

    904

    瀏覽量

    54241
  • CW32
    +關注

    關注

    1

    文章

    143

    瀏覽量

    355
收藏 人收藏

    評論

    相關推薦

    請問如何優化CW32L083微控制器的功耗?

    在進行低功耗設計時,如何優化CW32L083系列微控制器的功耗?
    發表于 01-17 07:16

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

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

    CW32L083如何實現AUTOTRIM時鐘校準?

    CW32L083如何實現AUTOTRIM時鐘校準?
    的頭像 發表于 11-07 17:17 ?306次閱讀
    <b class='flag-5'>CW32L083</b>如何實現AUTOTRIM時鐘校準?

    CW32L083的UART單線半雙工模式介紹

    CW32L083的UART單線半雙工模式介紹
    的頭像 發表于 10-24 17:49 ?574次閱讀
    <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 ?462次閱讀
    基于<b class='flag-5'>CW32L083</b>評估板的簡易低功耗功能測試

    CW32L083移植驅動st7735 TFT屏

    CW32L083上驅動ST7735屏
    的頭像 發表于 07-04 19:16 ?1140次閱讀
    <b class='flag-5'>CW32L083</b>移植驅動st7735 TFT屏

    基于CW32L083的線控器方案設計

    基于武漢芯源推出的CW32L083設計的空調線控器產品.
    的頭像 發表于 06-25 14:23 ?3.8w次閱讀
    基于<b class='flag-5'>CW32L083</b>的線控器方案設計

    CW32L083 RTC初始化設置

    介紹CW32L083的RTC初始化設置
    的頭像 發表于 06-24 10:16 ?1066次閱讀
    <b class='flag-5'>CW32L083</b> RTC初始化設置

    CW32L083實現SHT30驅動

    CW32L083驅動SHT30,并顯示到LCD屏上。
    的頭像 發表于 06-22 09:57 ?2475次閱讀
    <b class='flag-5'>CW32L083</b>實現SHT30驅動

    基于CW32L083的空調遙控器方案設計

    基于武漢芯源半導體推出的CW32L083而設計的的空調遙控器方案
    的頭像 發表于 06-21 16:03 ?1252次閱讀
    基于<b class='flag-5'>CW32L083</b>的空調遙控器方案設計

    CW32L083段碼屏驅動

    CW32L083開發板上有8個段碼LCD顯示,使其顯示為0-9數字。
    的頭像 發表于 06-18 09:13 ?18w次閱讀
    <b class='flag-5'>CW32L083</b>段碼屏驅動
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>