0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

AT指令簡(jiǎn)介、設(shè)計(jì)與實(shí)現(xiàn)

靈動(dòng)MM32MCU ? 來(lái)源:靈動(dòng)MM32MCU ? 作者:靈動(dòng)MM32MCU ? 2022-08-19 10:10 ? 次閱讀

1

AT指令簡(jiǎn)介

AT命令作為主控芯片通信模塊的協(xié)議接口,通常使用串口作為通信協(xié)議的傳輸,因此在通信模塊中硬件接口通常為串口,這樣簡(jiǎn)化了主控設(shè)備的代碼開(kāi)發(fā)。

AT指令通常由前綴、主體、結(jié)束符構(gòu)成,其中前綴為“AT”,主體由命令、參數(shù)以及數(shù)據(jù)組成;結(jié)束符一般為“ ”。

AT指令的發(fā)送內(nèi)容最多為1056個(gè)字符的長(zhǎng)度(不包括“AT”,但包括最后的空字符即回車(chē)符號(hào))

使用AT指令進(jìn)行設(shè)備的連接通信,AT client與AT server必須共同完成。

即:AT server 必須對(duì)接收的AT client的命令進(jìn)行判斷并發(fā)送響應(yīng)給到AT client;AT client 等待響應(yīng),并對(duì)響應(yīng)的數(shù)據(jù)進(jìn)行解析處理。

當(dāng)然AT server也可主動(dòng)發(fā)送數(shù)據(jù)給AT client,AT client對(duì)接收的數(shù)據(jù)進(jìn)行解析處理。一般是需要用戶做出相應(yīng)操作的情況,例如:WiFi的斷開(kāi)連接等。

因此,AT server發(fā)送的數(shù)據(jù)可以分為兩種,一種是響應(yīng)數(shù)據(jù),另一種則是主動(dòng)發(fā)送的數(shù)據(jù)(URC)。

AT指令集是用于實(shí)現(xiàn)設(shè)備(AT client)與服務(wù)器(AT Server)之前的連接與通信的方式。

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

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

AT server需要接收AT Client的請(qǐng)求,對(duì)請(qǐng)求進(jìn)行響應(yīng),解析。將響應(yīng)和解析結(jié)果發(fā)送給AT client。

2

設(shè)計(jì)思路

通過(guò)串口助手發(fā)送AT指令給目標(biāo)mcu,目標(biāo)mcu對(duì)接收的數(shù)據(jù)進(jìn)行解析和超時(shí)判斷,并響應(yīng)解析結(jié)果,執(zhí)行對(duì)應(yīng)的響應(yīng)。

設(shè)計(jì)思路如圖所示:

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

3

具體實(shí)現(xiàn)

超時(shí)設(shè)計(jì)

通過(guò)滴答定時(shí)器進(jìn)行接收和發(fā)送的超時(shí)判斷。

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

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

解析器設(shè)計(jì)

判斷接收到正確的AT指令是否超時(shí),若超時(shí)則返回超時(shí)并發(fā)送[AT] TIMEOUT給客戶端,清除計(jì)數(shù)值,同時(shí)清空將數(shù)據(jù)接收緩存區(qū)。

將目標(biāo)mcu接收的數(shù)據(jù)和發(fā)送的AT指令進(jìn)行比較,若匹配則返回匹配成功并發(fā)送“[AT] OK”給客戶端,若失敗則返回錯(cuò)誤”[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的默認(rèn)debug接口,UART1(PB6,和PB7),使用接收中斷來(lái)接收串口助手發(fā)送的數(shù)據(jù),具體實(shí)現(xiàn)如下:

實(shí)例化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需要配置:時(shí)鐘頻率、波特率、數(shù)據(jù)長(zhǎng)度、停止位、傳輸模式及是否使用校驗(yàn)。

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);
}

發(fā)送函數(shù) 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);
}

接收函數(shù) 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);
}

發(fā)送字符串函數(shù) void uart_putbuffer(uint8_t *str)

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

中斷處理函數(shù)

在中斷中進(jìn)行接收數(shù)據(jù)的處理,判斷是否接收到完整的一行命令.當(dāng)接收到回車(chē)換行符時(shí),即表示接收到了一行完整的命令。

/*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() 函數(shù)

main()函數(shù)結(jié)合上述操作,不斷執(zhí)行用戶自定義的任務(wù)task()

intmain(void)
{
BOARD_Init();

while(1)
{
task();
}
}

用戶自定義的任務(wù) task()

用戶設(shè)定接收完整的一行AT指令的時(shí)間,調(diào)用AT指令解析函數(shù),根據(jù)響應(yīng)結(jié)果執(zhí)行自定義任務(wù)。

當(dāng)接收的命令和發(fā)送命令匹配時(shí),串口助手顯示[AT]READY。

當(dāng)匹配失敗時(shí),串口助手顯示[AT]ERROR,小燈長(zhǎng)亮。

當(dāng)指定時(shí)間內(nèi)(本實(shí)驗(yàn)設(shè)置為5s)沒(méi)有接收到完整的一行指令時(shí),串口助手顯示[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指令庫(kù),本此實(shí)驗(yàn)中定義的AT指令庫(kù)為:

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

task任務(wù)解讀:

當(dāng)通過(guò)串口發(fā)送“AT+RST ”時(shí),mcu響應(yīng)指令,并反饋?lái)憫?yīng)結(jié)果給串口助手,若接收正確指令則執(zhí)行預(yù)設(shè)任務(wù),發(fā)送[AT] READY給串口助手。

當(dāng)通過(guò)串口發(fā)送“AT+LED=1 ”時(shí),mcu響應(yīng)指令,并反饋?lái)憫?yīng)結(jié)果給串口助手,若接收正確指令則執(zhí)行預(yù)設(shè)任務(wù),點(diǎn)亮小燈。

4

實(shí)驗(yàn)結(jié)果

5

測(cè)試環(huán)境

//

? KEIL 5.37為程序下載調(diào)試環(huán)境

? Tera Term作為串口數(shù)據(jù)的發(fā)送和顯示的客戶端

? 測(cè)試板為POKT-F0040

審核編輯:湯梓紅


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 串口
    +關(guān)注

    關(guān)注

    14

    文章

    1535

    瀏覽量

    75876
  • AT指令
    +關(guān)注

    關(guān)注

    1

    文章

    41

    瀏覽量

    12095
  • MM32
    +關(guān)注

    關(guān)注

    1

    文章

    106

    瀏覽量

    721

原文標(biāo)題:靈動(dòng)微課堂 (第227講) | 基于F0040串口實(shí)現(xiàn)AT指令解析

文章出處:【微信號(hào):MindMotion-MMCU,微信公眾號(hào):靈動(dòng)MM32MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    NOP指令實(shí)現(xiàn)過(guò)程

    NOP(No Operation)意為無(wú)操作,是匯編語(yǔ)言的一個(gè)指令。NOP指令既空指令。NOP指令通常作為偽指令。但是,如果在ARMv6K、
    的頭像 發(fā)表于 09-28 15:47 ?9052次閱讀
    NOP<b class='flag-5'>指令</b><b class='flag-5'>實(shí)現(xiàn)</b>過(guò)程

    RISC-V架構(gòu)簡(jiǎn)介

    【摘要】 本文首先對(duì)RISC-V的架構(gòu)做了簡(jiǎn)要的介紹,在此基礎(chǔ)上實(shí)現(xiàn)了LiteOS在RISC-V架構(gòu)上的適配過(guò)程的具體步驟,希望對(duì)你有所幫助。1 RISC-V架構(gòu)簡(jiǎn)介RISC-V是一個(gè)基于精簡(jiǎn)指令
    發(fā)表于 07-28 07:46

    時(shí)間戳的簡(jiǎn)介實(shí)現(xiàn)

    時(shí)間戳?xí)r間戳簡(jiǎn)介時(shí)間戳的實(shí)現(xiàn)時(shí)間戳的初始化時(shí)間戳簡(jiǎn)介簡(jiǎn)而言之,就是在代碼中插下標(biāo)注,在代碼運(yùn)行后通過(guò)算開(kāi)始節(jié)點(diǎn)TimeStart和結(jié)束節(jié)點(diǎn)TimeEnd之間的間隔就可以得出代碼運(yùn)行的時(shí)間。時(shí)間戳
    發(fā)表于 02-28 06:23

    單片機(jī)指令系統(tǒng)

    單片機(jī)指令系統(tǒng) 3.1 MCS-51指令簡(jiǎn)介 3.2 指令系統(tǒng) 3.1  MCS-51指令
    發(fā)表于 06-16 22:51 ?35次下載

    嵌入式CPU指令Cache的設(shè)計(jì)與實(shí)現(xiàn)

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

    歐盟環(huán)保指令簡(jiǎn)介

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

    DSP常用匯編語(yǔ)言指令簡(jiǎn)介

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

    DSP指令系統(tǒng)

    DSP指令系統(tǒng) 指令系統(tǒng)簡(jiǎn)介TMS320C24x系列DSP偽指令極為豐富,安裝指令可以分為六大類(lèi):1. Accumulator(累加器
    發(fā)表于 03-30 15:52 ?19次下載

    MCS-51指令簡(jiǎn)介

    MCS-51指令簡(jiǎn)介     MCS-51系列單片機(jī)指令系統(tǒng)分類(lèi)     計(jì)算機(jī)的許多功能都是由程序實(shí)現(xiàn),而程
    發(fā)表于 03-11 09:44 ?1635次閱讀

    Thumb指令集之Thumb指令應(yīng)用

    11.9 Thumb指令應(yīng)用 11.9.1 Thumb的實(shí)現(xiàn) 對(duì)3級(jí)流水線的ARM處理器來(lái)說(shuō),做相對(duì)較小的改動(dòng)就可以實(shí)現(xiàn)Thumb指令集(5級(jí)流水線的
    發(fā)表于 10-19 09:34 ?0次下載
    Thumb<b class='flag-5'>指令</b>集之Thumb<b class='flag-5'>指令</b>應(yīng)用

    單片機(jī)的指令周期的簡(jiǎn)介和內(nèi)核架構(gòu)詳細(xì)說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是單片機(jī)的指令周期的簡(jiǎn)介和內(nèi)核架構(gòu)詳細(xì)說(shuō)明包括了:機(jī)器周期、狀態(tài)周期、時(shí)鐘周期
    發(fā)表于 09-19 17:19 ?5次下載
    單片機(jī)的<b class='flag-5'>指令</b>周期的<b class='flag-5'>簡(jiǎn)介</b>和內(nèi)核架構(gòu)詳細(xì)說(shuō)明

    51單片機(jī)指令系統(tǒng)的詳細(xì)資料簡(jiǎn)介

    MCS-51單片機(jī)指令系統(tǒng)(一) 指令系統(tǒng)簡(jiǎn)介1. 指令分類(lèi)統(tǒng)計(jì)指令總數(shù):111條 操作碼:255個(gè) 助記符:48個(gè)
    的頭像 發(fā)表于 12-06 17:08 ?5311次閱讀

    基于FPGA的ROM的實(shí)現(xiàn)簡(jiǎn)介

    基于FPGA的ROM的實(shí)現(xiàn)簡(jiǎn)介(嵌入式開(kāi)發(fā)工程師培訓(xùn)學(xué)校)-該文檔為基于FPGA的ROM的實(shí)現(xiàn)簡(jiǎn)介資料,講解的還不錯(cuò),感興趣的可以下載看看…………………………
    發(fā)表于 07-30 09:08 ?5次下載
    基于FPGA的ROM的<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>簡(jiǎn)介</b>

    ESP8266官方AT指令實(shí)現(xiàn)方法

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

    匯編指令是什么 計(jì)算機(jī)語(yǔ)言匯編指令簡(jiǎn)介

    匯編指令簡(jiǎn)介 匯編語(yǔ)言是計(jì)算機(jī)語(yǔ)言的一種,是一種低級(jí)語(yǔ)言。相比高級(jí)語(yǔ)言,匯編語(yǔ)言更接近底層硬件,使用更加直接,效率更高。但相對(duì)而言,匯編語(yǔ)言更加復(fù)雜,語(yǔ)法更加嚴(yán)格。 操作數(shù)指示符: 大多數(shù)指令有一個(gè)
    的頭像 發(fā)表于 12-13 11:18 ?996次閱讀
    匯編<b class='flag-5'>指令</b>是什么 計(jì)算機(jī)語(yǔ)言匯編<b class='flag-5'>指令</b><b class='flag-5'>簡(jiǎn)介</b>