国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

    文章

    623

    瀏覽量

    37529
  • 串口
    +關注

    關注

    15

    文章

    1618

    瀏覽量

    82807
  • 開發板
    +關注

    關注

    26

    文章

    6289

    瀏覽量

    118047
  • 上位機
    +關注

    關注

    27

    文章

    1002

    瀏覽量

    57045
  • CW32
    +關注

    關注

    1

    文章

    299

    瀏覽量

    1843
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    基于CW32L083的AT指令框架的創建

    框架的創建。 首先定義了指令結構: typedefenum{ AT_CMD_TEST=0, /* 測試指令 */ AT_CMD_SETRTC,/* 設置RTC指令 */
    發表于 01-06 06:17

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

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

    請問如何解決CW32L083系列微控制器在通信過程中可能出現的數據錯誤問題?

    如何解決CW32L083系列微控制器在通信過程中可能出現的數據錯誤問題?
    發表于 12-16 08:01

    CW32L083系列微控制器有哪些應用場景?

    CW32L083系列微控制器有哪些應用場景
    發表于 12-16 07:52

    在進行低功耗設計時如何優化CW32L083系列微控制器的功耗?

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

    請問CW32L083如何實現AUTOTRIM時鐘校準?

    如題,CW32L083如何實現AUTOTRIM時鐘校準?有沒有HSIOSC時鐘校準編程示例?
    發表于 12-16 06:02

    請問如何利用CW32L083系列微控制器的內部Flash存儲器進行程序升級和數據存儲?

    如何利用CW32L083系列微控制器的內部Flash存儲器進行程序升級和數據存儲?
    發表于 12-15 07:39

    在開發過程中如何利用CW32L083系列微控制器的官方固件庫進行程序編寫和調試?

    在開發過程中,如何利用CW32L083系列微控制器的官方固件庫進行程序編寫和調試?
    發表于 12-15 07:23

    CW32L083系列微控制器的時鐘配置有哪些選項?

    CW32L083系列微控制器的時鐘配置有哪些選項?如何選擇合適的時鐘源?
    發表于 12-15 07:09

    CW32L083的基本定時器

    CW32L083 內部集成 3 個基本定時器 (BTIM),每個 BTIM 完全獨立且功能完全相同,各包含一個 16bit 自動重裝 載計數器并由一個可編程預分頻器驅動。BTIM 支持定時器模式
    發表于 12-15 06:23

    在使用CW32L083系列微控制器時如何配置中斷向量表?

    在使用CW32L083系列微控制器時,如何配置中斷向量表?
    發表于 12-15 06:17

    在使用CW32L083系列微控制器時如何進行系統復位和看門狗定時器配置?

    在使用CW32L083系列微控制器時,如何進行系統復位和看門狗定時器配置?
    發表于 12-10 06:46

    CW32L083的內置獨立校準的RTC這一般怎么玩?

    CW32L083的內置獨立校準的RTC這一般怎么玩?
    發表于 12-09 07:04

    CW32L083系列微控制器有哪些主要特點?

    CW32L083系列微控制器有哪些主要特點
    發表于 12-09 06:34

    CW32L083有哪些應用場景?

    CW32L083有哪些應用場景
    發表于 11-24 07:37