色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

AT指令簡介、設計與實現

靈動MM32MCU ? 來源:靈動MM32MCU ? 作者:靈動MM32MCU ? 2022-08-19 10:10 ? 次閱讀

1

AT指令簡介

AT命令作為主控芯片通信模塊的協議接口,通常使用串口作為通信協議的傳輸,因此在通信模塊中硬件接口通常為串口,這樣簡化了主控設備的代碼開發。

AT指令通常由前綴、主體、結束符構成,其中前綴為“AT”,主體由命令、參數以及數據組成;結束符一般為“ ”。

AT指令的發送內容最多為1056個字符的長度(不包括“AT”,但包括最后的空字符即回車符號)

使用AT指令進行設備的連接通信,AT client與AT server必須共同完成。

即:AT server 必須對接收的AT client的命令進行判斷并發送響應給到AT client;AT client 等待響應,并對響應的數據進行解析處理。

當然AT server也可主動發送數據給AT client,AT client對接收的數據進行解析處理。一般是需要用戶做出相應操作的情況,例如:WiFi的斷開連接等。

因此,AT server發送的數據可以分為兩種,一種是響應數據,另一種則是主動發送的數據(URC)。

AT指令集是用于實現設備(AT client)與服務器(AT Server)之前的連接與通信的方式。

28831620-1ee3-11ed-ba43-dac502259ad0.png

由上圖可以看出,AT Client和AT Server既是發送端也是接收端。

AT server需要接收AT Client的請求,對請求進行響應,解析。將響應和解析結果發送給AT client。

2

設計思路

通過串口助手發送AT指令給目標mcu,目標mcu對接收的數據進行解析和超時判斷,并響應解析結果,執行對應的響應。

設計思路如圖所示:

289bd390-1ee3-11ed-ba43-dac502259ad0.png

3

具體實現

超時設計

通過滴答定時器進行接收和發送的超時判斷。

/*Timeoutjudgment.*/
boolis_timeout(uint32_ttimeout)
{
returntick>timeout;
}

/*SysTickISRentry.*/
voidSysTick_Handler(void)
{
tick+=1;
}

解析器設計

判斷接收到正確的AT指令是否超時,若超時則返回超時并發送[AT] TIMEOUT給客戶端,清除計數值,同時清空將數據接收緩存區。

將目標mcu接收的數據和發送的AT指令進行比較,若匹配則返回匹配成功并發送“[AT] OK”給客戶端,若失敗則返回錯誤”[AT] ERROR“給客戶端。

uint32_tat_parse(char*cmdstr,uint32_ttimeout)
{
uint32_tret;
tick=0;
while(!(is_timeout(timeout)))
{
if(REC_STA)/*receiveacompletelinecommand.*/
{
REC_STA=false;
for(uint32_ti=0;i<strlen(cmdstr);i++)
{
tick=0;
if(rec_buff[i]==cmdstr[i])
{
ret=AT_RETURN_OK;
}
else
{
ret=AT_RETURN_ERROR;
}
}
memset(rec_buff,0,sizeof(rec_buff));/*clearreceiverbuffer.*/
returnret;
}
}
tick=0;
ret=AT_RETURN_TIMEOUT;
memset(rec_buff,0,sizeof(rec_buff));/*clearreceiverbuffer.*/
returnret;
}

AT 適配器配置

使用pokt-f0040的默認debug接口,UART1(PB6,和PB7),使用接收中斷來接收串口助手發送的數據,具體實現如下:

實例化AT適配器

/*initializetheatadaptter.*/
staticAT_Adapter_Typeat=
{
.write=uart_putchar,
.read=uart_getchar,
.rec_buf=rec_buff,
.buf_idx=0u
};

AT接口初始化 void app_at_port_init(void)

初始化UART需要配置:時鐘頻率、波特率、數據長度、停止位、傳輸模式及是否使用校驗。

voidapp_at_port_init(void)
{
UART_Init_Typeuart_init;

/*Setupthexferengine.*/
uart_init.ClockFreqHz=BOARD_AT_UART_FREQ;/*48mhz,APB2.*/
uart_init.BaudRate=BOARD_AT_UART_BAUDRATE;
uart_init.WordLength=UART_WordLength_8b;
uart_init.StopBits=UART_StopBits_1;
uart_init.Parity=UART_Parity_None;
uart_init.XferMode=UART_XferMode_RxTx;
uart_init.HwFlowControl=UART_HwFlowControl_None;
UART_Init(BOARD_AT_UART_PORT,&uart_init);

/*EnableRXinterrupt.*/
UART_EnableInterrupts(BOARD_AT_UART_PORT,UART_INT_RX_DONE,true);
NVIC_EnableIRQ(BOARD_AT_UART_IRQn);

/*EnableUART.*/
UART_Enable(BOARD_AT_UART_PORT,true);

/*EnableUART.*/
UART_Enable(BOARD_AT_UART_PORT,true);
}

發送函數 uart_putchar(uint8_t c)

/*sneddata.*/
voiduart_putchar(uint8_tc)
{
while(0u==(UART_STATUS_TX_EMPTY&UART_GetStatus(BOARD_AT_UART_PORT)))/*Waitingtxbufferempty.*/
{}
UART_PutData(BOARD_AT_UART_PORT,c);
}

接收函數 uint8_t uart_getchar(void)

uint8_tuart_getchar(void)
{
while(0u==(UART_STATUS_RX_DONE&UART_GetStatus(BOARD_AT_UART_PORT)))/*Waitingrxbufferreceivesacompletebyteofdata.*/
{}
returnUART_GetStatus(BOARD_AT_UART_PORT);
}

發送字符串函數 void uart_putbuffer(uint8_t *str)

/*sendstring.*/
voiduart_putbuffer(uint8_t*str)
{
while((*str)!='?')
{
uart_putchar(*str);
str++;
}
}

中斷處理函數

在中斷中進行接收數據的處理,判斷是否接收到完整的一行命令.當接收到回車換行符時,即表示接收到了一行完整的命令。

/*receiverhandler*/
voidapp_at_port_rx_isr_hook(void)
{
tick=0;
if((0u!=(UART_INT_RX_DONE&UART_GetEnabledInterrupts(BOARD_AT_UART_PORT)))
&&(0u!=(UART_INT_RX_DONE&UART_GetInterruptStatus(BOARD_AT_UART_PORT))))
{
rec_buff[at.buf_idx]=UART_GetData(BOARD_AT_UART_PORT);/*readdatatoclearrxinterruptbits.*/
uart_putchar(rec_buff[at.buf_idx]);
if((rec_buff[at.buf_idx]=='
')&&(rec_buff[at.buf_idx-1]=='
'))/*recievedone.*/
{
REC_STA=true;
at.buf_idx=0;
}
at.buf_idx=(at.buf_idx+1)%AT_CMD_LEN;
}
}
/*BOARD_AT_UART_IRQHandlerISRentry.*/
voidBOARD_AT_UART_IRQHandler(void)
{
app_at_port_rx_isr_hook();
}

main() 函數

main()函數結合上述操作,不斷執行用戶自定義的任務task()

intmain(void)
{
BOARD_Init();

while(1)
{
task();
}
}

用戶自定義的任務 task()

用戶設定接收完整的一行AT指令的時間,調用AT指令解析函數,根據響應結果執行自定義任務。

當接收的命令和發送命令匹配時,串口助手顯示[AT]READY。

當匹配失敗時,串口助手顯示[AT]ERROR,小燈長亮。

當指定時間內(本實驗設置為5s)沒有接收到完整的一行指令時,串口助手顯示[AT]TIMEOUT,小燈以1s間隔閃爍。

voidtask(void)
{
while(AT_Parse(&at,cmdlib[0],5000))
{}
AT_SendBuf(&at,"
[AT]READY
");
while(AT_Parse(&at,cmdlib[1],5000))
{}
GPIO_WriteBit(BOARD_LED0_GPIO_PORT,BOARD_LED0_GPIO_PIN,0u);
}

代碼中的“cmdlib”為用戶自定義的AT指令庫,本此實驗中定義的AT指令庫為:

/*customATcommandset.*/
char*cmdlib[command_len]={"AT+RST","AT+LED=1"};

task任務解讀:

當通過串口發送“AT+RST ”時,mcu響應指令,并反饋響應結果給串口助手,若接收正確指令則執行預設任務,發送[AT] READY給串口助手。

當通過串口發送“AT+LED=1 ”時,mcu響應指令,并反饋響應結果給串口助手,若接收正確指令則執行預設任務,點亮小燈。

4

實驗結果

5

測試環境

//

? KEIL 5.37為程序下載調試環境

? Tera Term作為串口數據的發送和顯示的客戶端

? 測試板為POKT-F0040

審核編輯:湯梓紅


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 串口
    +關注

    關注

    14

    文章

    1551

    瀏覽量

    76421
  • AT指令
    +關注

    關注

    1

    文章

    41

    瀏覽量

    12128
  • MM32
    +關注

    關注

    1

    文章

    106

    瀏覽量

    756

原文標題:靈動微課堂 (第227講) | 基于F0040串口實現AT指令解析

文章出處:【微信號:MindMotion-MMCU,微信公眾號:靈動MM32MCU】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    NOP指令實現過程

    NOP(No Operation)意為無操作,是匯編語言的一個指令。NOP指令既空指令。NOP指令通常作為偽指令。但是,如果在ARMv6K、
    的頭像 發表于 09-28 15:47 ?9470次閱讀
    NOP<b class='flag-5'>指令</b><b class='flag-5'>實現</b>過程

    RISC-V架構簡介

    【摘要】 本文首先對RISC-V的架構做了簡要的介紹,在此基礎上實現了LiteOS在RISC-V架構上的適配過程的具體步驟,希望對你有所幫助。1 RISC-V架構簡介RISC-V是一個基于精簡指令
    發表于 07-28 07:46

    時間戳的簡介實現

    時間戳時間戳簡介時間戳的實現時間戳的初始化時間戳簡介簡而言之,就是在代碼中插下標注,在代碼運行后通過算開始節點TimeStart和結束節點TimeEnd之間的間隔就可以得出代碼運行的時間。時間戳
    發表于 02-28 06:23

    單片機指令系統

    單片機指令系統 3.1 MCS-51指令簡介 3.2 指令系統 3.1  MCS-51指令
    發表于 06-16 22:51 ?35次下載

    嵌入式CPU指令Cache的設計與實現

    針對嵌入式CPU 指令處理速度與存儲器指令存取速度不匹配問題,本文基于FPGA 設計并實現了可以有效解決這一問題的指令Cache。根據嵌入式五級流水線CPU 特性,所設計
    發表于 08-05 14:27 ?36次下載

    歐盟環保指令簡介

    歐盟《報廢電子電器設備指令》(WEEE)和《關于在電子電氣設 備中限制使用某些有害物質指令》(ROHS)環保兩指令的實施時間日益 迫近,家電制造商為了從源頭避免有害物質,紛紛
    發表于 08-12 13:16 ?24次下載

    DSP常用匯編語言指令簡介

    一、指令系統簡介TMS320C24x系列DSP偽指令極為豐富,安裝指令可以分為六大類:1. Accumulator(累加器指令), arit
    發表于 03-03 22:37 ?137次下載

    DSP指令系統

    DSP指令系統 指令系統簡介TMS320C24x系列DSP偽指令極為豐富,安裝指令可以分為六大類:1. Accumulator(累加器
    發表于 03-30 15:52 ?19次下載

    MCS-51指令簡介

    MCS-51指令簡介     MCS-51系列單片機指令系統分類     計算機的許多功能都是由程序實現,而程
    發表于 03-11 09:44 ?1690次閱讀

    Thumb指令集之Thumb指令應用

    11.9 Thumb指令應用 11.9.1 Thumb的實現 對3級流水線的ARM處理器來說,做相對較小的改動就可以實現Thumb指令集(5級流水線的
    發表于 10-19 09:34 ?0次下載
    Thumb<b class='flag-5'>指令</b>集之Thumb<b class='flag-5'>指令</b>應用

    單片機的指令周期的簡介和內核架構詳細說明

    本文檔的主要內容詳細介紹的是單片機的指令周期的簡介和內核架構詳細說明包括了:機器周期、狀態周期、時鐘周期
    發表于 09-19 17:19 ?5次下載
    單片機的<b class='flag-5'>指令</b>周期的<b class='flag-5'>簡介</b>和內核架構詳細說明

    51單片機指令系統的詳細資料簡介

    MCS-51單片機指令系統(一) 指令系統簡介1. 指令分類統計指令總數:111條 操作碼:255個 助記符:48個
    的頭像 發表于 12-06 17:08 ?5488次閱讀

    基于FPGA的ROM的實現簡介

    基于FPGA的ROM的實現簡介(嵌入式開發工程師培訓學校)-該文檔為基于FPGA的ROM的實現簡介資料,講解的還不錯,感興趣的可以下載看看…………………………
    發表于 07-30 09:08 ?5次下載
    基于FPGA的ROM的<b class='flag-5'>實現</b><b class='flag-5'>簡介</b>

    ESP8266官方AT指令實現方法

    官方的AT固件是不開源的,指令解析和功能實現被封裝成靜態庫了,這套AT指令可以很方便的控制芯片,滿足一些基本的功能需求,比如AT+MQTT,AT+WEB服務器等,今天記錄一下如何實現
    的頭像 發表于 05-17 16:13 ?1597次閱讀

    匯編指令是什么 計算機語言匯編指令簡介

    匯編指令簡介 匯編語言是計算機語言的一種,是一種低級語言。相比高級語言,匯編語言更接近底層硬件,使用更加直接,效率更高。但相對而言,匯編語言更加復雜,語法更加嚴格。 操作數指示符: 大多數指令有一個
    的頭像 發表于 12-13 11:18 ?1233次閱讀
    匯編<b class='flag-5'>指令</b>是什么 計算機語言匯編<b class='flag-5'>指令</b><b class='flag-5'>簡介</b>
    主站蜘蛛池模板: gogogo免费视频观看| 久久怡红院国产精品| 婷婷综合久久狠狠色| 国产精品99亚发布| 成人免费视频在线观看| av网站视频在线观看| 2019一級特黃色毛片免費看| 在线亚洲97se| 伊人热| 在线观看免费av网站| 中国人泡妞xxxxxxxx19| 樱花动漫成人隐藏入口| 一级毛片皇帝 宫女| 在线观看99| 69日本人xxxx16—18| 2020年国产精品午夜福利在线观看 | 亚洲精品久久久久69影院| 乡村教师电影完整版在线观看| 忘忧草在线影院WWW日本动漫| 特黄特色大片免费播放器9| 天天干夜夜叭| 校园女教师之禁区| 亚洲免费精品视频| 一级做a爰片久久毛片潮喷动漫| 伊人AV一区二区三区夜色撩人| 有人在线观看的视频吗免费| 最近中文字幕2018MV高清在线| 97精品国产高清在线看入口| yellow免费| 国产成人免费片在线视频观看| 国产免费不卡| 久久re视频这里精品09免费| 美女打开双腿扒开屁股男生| 欧美午夜精品一区区电影| 色欲国产麻豆一精品一AV一免费| 小776 论坛| 中文字幕s级优女区| S货SAO死你BL大点声叫BL| 国产成人综合95精品视频免费| 好男人好资源视频高清| 美女强奷到抽搐在线播放|