AT指令(嵌入式 物聯網)程式設計心得C語言

2021-08-28 08:23:15 字數 3162 閱讀 2733

本文拿我當初做了乙個共享裝置為例,最開始用的硬體是stm32f1+sim800(2g),這兩個應該是國內做共享裝置最普遍的組合了,因為據說聯通2g快淘汰了,如果想用4g的sim7600,但是這也不影響at指令使用,大家也可以用nbiot(sim7000)或者移遠的.

1,stm32f1串列埠使用(中斷+dma接受 與 dma傳送)

stm32的串列埠大家可能都會用,但是還是有很多小白不會使用接受不定長資料,接受的最好方式就是(中斷+dma),配置就是基礎的gpio口配置,串列埠配置,dma配置 這裡不做多說,網上有太多demo。

接受中斷最好用空閒中斷(usart_it_idle),中斷內部先dma失能,然後再dma使能,目的是為了獲得發來資料及資料長度。 以串列埠3為例(因為本人串列埠1用來debug,串列埠2用來傳資料幀了)。

建立 串列埠接受緩衝區(全域性變數)u8 usart3_rx_buf[usart3_max_recv_len];

//剛才提到的配置

uart_dma_config(dma1_channel3,(u32)&usart3->dr,(u32)usart3_rx_buf,dma_dir_peripheralsrc);

if(usart_getitstatus(usart3, usart_it_idle) != reset)

在中斷函式末尾,別忘了usart3->sr與usart3->dr還有各種清楚故障標誌位的。

2,資料接受處理(循壞佇列)

at指令最重要的就是提取有效並且最準確的資料,但是接受到的資料很有可能是不及時的,粘包的,快速的(還沒處理完就發過來了),甚至我還遇見過乙個指令在另一條指令的中間的奇葩事件,粘包和快速資料,粘包和快速資料的處理方法是採用迴圈佇列,首先我選擇了使用中斷判斷後進入兩個不同的緩衝區,然後程式執行過程中輪詢取結果即可。為什麼取兩個呢,因為乙個用作與at模組的at指令通訊,乙個用作接受傳送方的資料快取。

(1)判斷用if(strstr((char *)usart3_rx_buf,"+ipd"))即可,「+ipd」的意思就是這個指令接下來的資料是傳送方發的資料而並非是模組的簡單at互動,因為傳送方(本專案是伺服器),那麼有這個「+ipd」的就是伺服器資料,保留在新的快取區,沒有「+ipd」的繼續放在usart3_rx_buf裡即可。

(2)與simcom模組at的互動指令分為兩種,第一種是及時接受(也就是你傳送它就馬上接受),第二種是等一會兒才能接受,第一種用硬延時即可,第二種需要定時器中斷加上標誌位,傳送此指令,設立相應標誌位,程式順次執行其他命令,如果計時結束還沒有在usart3_rx_buf中發現此結果,採取重發機制。

(3)伺服器發來的資料是最重要的,也就是"+ipd"資料,因為簡單的模組at互動指令沒有接收到「ok」,繼續傳送即可,但是如果伺服器資料沒有接收到會影響很多,因為相當於控制失效,是個很嚴重的後果,所以確保伺服器資料能及時傳送並且解析成功,我採用了迴圈佇列,判斷是伺服器資料入列enqueue(attemp ,&atline);,需要解析伺服器資料時出列dequeue(&attemp ,&atline);。

附(c primer plus 佇列**)

#include "ringqueue.h"

#include "malloc.h"

static void copytonode(item item, node *pn);

static void copytoitem(node *pn, item *pi);

void initializequeue(queue *pq)

bool queueisfull(const queue *pq)

bool queueisempty(const queue *pq)

int queueitemcount(const queue *pq)

bool enqueue(item item, queue *pq)

/*出佇列應該判斷是否粘包*/

bool dequeue(item *pitem, queue *pq)

void emptythequeue(queue *pq)

static void copytonode(item item, node *pn)

static void copytoitem(node *pn, item *pi)

這個是利用鍊錶方式組成迴圈佇列,因為伺服器粘包最多為兩包,所以當判斷為粘包時,將粘包的前包進行處理,後包擷取到另乙個資料幀即可,利用標誌位先判斷是否發生粘包,下一次處理資料時先判斷粘包標誌位,如果發生粘包就先處理上一次粘包擷取後的後包。(因為這段**涉及公司業務,就不貼上出來了)。

還有一種方式是利用大陣列來組成迴圈佇列,這個陣列方式其實更適合管理伺服器發來的資料,只要根據幀頭及幀的資料長度即可。

3,傳送at指令方法

通常at指令的傳送函式都是三個形參,at命令(u8 *cmd),at應答(u8 *ack),等待時間(u16 waittime)

類似u8 sim800_send_cmd(u8 *cmd,u8 *ack,u16 waittime);其實還可以設定兩個at應答ack1 和ack2,判斷的話用接受到的緩衝區是否同時含有這兩個字串,這個也不難在下面demo改改就可以。

u8 sim800_send_cmd(u8 *cmd,u8 *ack,u16 waittime)

//clear_usart3(); //放下面還是放在這裡合適

if((u32)cmd <= 0xff)

else

//clear_usart3(); //放上面還是放在這裡合適

if(ack&&waittime) //需要等待應答

//idle 是指串列埠同時收到"send ok" + "正確的伺服器回文",在

//定時器處理中已經將裝置狀態轉換為idle 狀態

//else if((dev.msg_recv & msg_dev_ack) && ((dev.status == cmd_idle) || (dev.status == cmd_open_device)))

else if(dev.msg_recv & msg_dev_ack)

waittime--;

} }else //不需要等待應答,這裡暫時不新增相關的處理**

return ret;

} void u3_printf(char* fmt,...)

}

物聯網嵌入式學習路線

嵌入式技術是各種電子產品的核心技術,也是工業4.0 遠端醫療 3d列印等新興產業的核心技術,具有廣闊的發展前景。很多計算機 電子資訊類專業的學生都想把嵌入式開發作為自己的職業目標,但是因為嵌入式涉及的知識太多,太雜,太廣,很多嵌入式初學者陷入嵌入式知識的海洋中,東學一點,西學一點,找不到學習的方向。...

物聯網正在蠶食嵌入式系統市場

barr集團首席技術官michaelbarr將在會上介紹他的2018年嵌入式系統安全與安全調查結果。對1700名員工的調查發現,61 的嵌入式設計現在至少偶爾會連線到網際網路。驚喜 他們並不全是安全的。好訊息是,67 的受訪者表示,安全性是設計考慮因素,比2016年調查提高了6個百分點。但22 的人...

嵌入式物聯網的硬體設計挑戰

隨著物聯網的出現,由於連線裝置的快速發展,嵌入式系統市場出現了大規模增長。由於物聯網,嵌入式智慧型連線以驚人的速度持續增長。嵌入式系統在物聯網中的作用 物聯網被定義為乙個過程,其中物件配備有涉及硬體板設計和開發的感測器,執行器和處理器,軟體系統,web api和協議,它們共同建立了嵌入式系統的連線環...