素材來(lái)源 |Github開源社區(qū)
在當(dāng)今物聯(lián)網(wǎng)(IoT)高速發(fā)展的時(shí)代,設(shè)備之間的高效通信成為了關(guān)鍵。AT指令作為設(shè)備通信的標(biāo)準(zhǔn)方式,被廣泛應(yīng)用于Modem、Wi-Fi模塊、藍(lán)牙等場(chǎng)景。然而,如何高效管理這些AT指令的通信交互,始終是開發(fā)者面臨的挑戰(zhàn)。為此,GitHub上的開源項(xiàng)目at-client-cmd應(yīng)運(yùn)而生,為開發(fā)者提供了一個(gè)強(qiáng)大而靈活的解決方案。
一、項(xiàng)目概述
at-client-cmd是一款用于管理AT指令通信交互的組件,適用于Modem、Wi-Fi模塊、藍(lán)牙等需要使用AT指令或ASCII命令行通信的場(chǎng)景。它涵蓋了大部分AT通信形式,如參數(shù)設(shè)置、查詢、二進(jìn)制數(shù)據(jù)發(fā)送等,同時(shí)支持自定義命令的交互管理。由于每個(gè)命令請(qǐng)求都是異步的,因此即使在無(wú)操作系統(tǒng)的環(huán)境下也能良好運(yùn)行。相較于V1版本,新版本在命令接收匹配、URC不定長(zhǎng)度數(shù)據(jù)捕獲以及內(nèi)存安全上進(jìn)行了大量?jī)?yōu)化,使其能夠應(yīng)對(duì)更復(fù)雜的產(chǎn)品應(yīng)用。
二、主要特性
- 異步命令請(qǐng)求:所有命令請(qǐng)求均為異步,無(wú)操作系統(tǒng)也可運(yùn)行。多樣化命令支持:支持單行命令、批量命令、可變參數(shù)命令以及自定義AT命令。完善的錯(cuò)誤處理機(jī)制:支持命令響應(yīng)超時(shí)、錯(cuò)誤重傳和優(yōu)先級(jí)管理。URC消息捕獲:支持不定長(zhǎng)度URC(未經(jīng)請(qǐng)求主動(dòng)上報(bào))消息的捕獲。多設(shè)備管理:支持多個(gè)AT設(shè)備的通信管理。內(nèi)存監(jiān)控:支持內(nèi)存使用監(jiān)視與限制。命令生命周期管理:支持命令請(qǐng)求的生命周期管理,實(shí)時(shí)監(jiān)視命令執(zhí)行狀態(tài)。命令透?jìng)鳎褐С置钔競(jìng)鞴δ堋?/ul>
三、系統(tǒng)要求
為了確保AT指令的正常通信,目標(biāo)系統(tǒng)需滿足以下要求:
- 動(dòng)態(tài)內(nèi)存支持。RAM資源:至少1KB(取決于接收緩沖區(qū)與URC緩沖區(qū)的設(shè)置),建議在可分配3KB以上內(nèi)存的系統(tǒng)中使用。編譯器:系統(tǒng)使用了一些C99的特性(如柔性數(shù)組、內(nèi)聯(lián)),因此編譯器需開啟對(duì)C99的支持。對(duì)于IAR、GCC,它們默認(rèn)是開啟的,而Keil MDK需要手動(dòng)增加編譯選項(xiàng)(--c99 --gnu)。
四、版本及其使用說(shuō)明
相較于V1版本,V2版本主要針對(duì)“at_chat”模塊進(jìn)行了整體優(yōu)化,支持URC功能,同時(shí)加強(qiáng)了對(duì)操作系統(tǒng)環(huán)境的支持。由于采用動(dòng)態(tài)內(nèi)存方式管理AT命令請(qǐng)求,對(duì)RAM資源的要求更高,但使用上更加便捷。下面簡(jiǎn)單介紹下如何使用(參考:https://github.com/zhbi98/at-client-cmd/tree/main):
定義適配器,完成驅(qū)動(dòng)接口及緩沖區(qū)設(shè)置
/**
?*?@brief?AT適配器
?*/
static?const?at_adapter_t?at_adapter?=?{
????.lock??????????=?at_mutex_lock,???????????//多任務(wù)上鎖(非OS下填NULL)
????.unlock????????=?at_mutex_unlock,?????????//多任務(wù)解鎖(非OS下填NULL)
????.write?????????=?at_device_write,?????????//串口數(shù)據(jù)寫接口(非阻塞式)
????.read??????????=?at_device_read,??????????//串口數(shù)據(jù)讀接口(非阻塞式)
????.debug?????????=?at_debug,????????????????//調(diào)試打印接口(不需要?jiǎng)t填NULL)?
????.recv_bufsize??=?256???????????????????????//接收緩沖區(qū)大小(按實(shí)際情況填寫)
};
使用AT適配器創(chuàng)建AT通信對(duì)象
????at_obj_t?*at_obj;
????//....
????at_obj?=?at_obj_create(&at_adapter);
????if?(at_obj?==?NULL)?{
????????printf("at?object?create?failedrn");
????}??
????//...
加入定時(shí)輪詢?nèi)蝿?wù)
/**
?*?@brief?輪詢程序
?*/
void?at_device_process(void)
{
????static?unsigned?int?timer;
????//為了加快AT命令處理響應(yīng)速度,建議5ms以內(nèi)輪詢一次
????if?(get_tick()?-?timer?>?5)?{
????????timer?=?get_tick();
????????at_obj_process(&at_obj);
????}????
}
發(fā)送AT命令
完成上面幾個(gè)步驟之后,就可以執(zhí)行AT命令請(qǐng)求了,下面以查詢MODEM信號(hào)質(zhì)量為例,演示如何發(fā)送AT命令及解析響應(yīng)內(nèi)容.
命令格式如下:
=>??AT+CSQ
<=??+CSQ:?<rssi>,<ber>
<=??OK
代碼實(shí)現(xiàn):
/**
?*?@brief??命令響應(yīng)處理程序
?*/
static?void?csq_respose_callback(at_response_t?*r)???
{
????int?rssi,?ber;
????//+CSQ:?<rssi>,<ber>
????if?(r->code?==?AT_RESP_OK)?{
????????//命令響應(yīng)成功后,解析出rssi,ber.
????????if?(sscanf(r->prefix,?"+CSQ:%d,%d",?&rssi,?&ber)?==?2)?{
????????????printf("rssi:%d,?ber:%drn",?rssi,?ber);
????????}
????}?else?{
????????printf("'CSQ'?command?response?failed!rn");
????}
}??
/**
?*?@brief??讀CSQ值請(qǐng)求
?*/
static?void?read_csq(void)
{
????//發(fā)送命令,超時(shí)時(shí)間為1000ms,重發(fā)次數(shù)為0
????at_send_singlline(at_obj,?csq_respose_callback,?1000,?0,?"AT+CSQ");?
}
下面是在M169 WIFI上運(yùn)行的效果圖(例子:at_chat/samples/none_os)
五、如何獲取
您可以在GitHub上訪問at-client-cmd項(xiàng)目,獲取詳細(xì)的文檔和源碼。該項(xiàng)目遵循Apache-2.0開源許可證,歡迎廣大開發(fā)者參與貢獻(xiàn)。
https://github.com/zhbi98/at-client-cmd
六、結(jié)語(yǔ)
AT 指令作為設(shè)備通信的標(biāo)準(zhǔn)方式,就像一座橋梁,連接著不同的設(shè)備,被廣泛應(yīng)用于 Modem、Wi-Fi 模塊、藍(lán)牙等場(chǎng)景。然而,如何高效管理這些 AT 指令的通信交互,始終是開發(fā)者面臨的挑戰(zhàn)。就好比在繁忙的交通樞紐,如何合理調(diào)度車輛,確保交通順暢,是一個(gè)復(fù)雜而又關(guān)鍵的問題。at-client-cmd組件為開發(fā)者提供了一個(gè)高效、靈活的AT指令通信管理方案。無(wú)論是在有操作系統(tǒng)還是無(wú)操作系統(tǒng)的環(huán)境下,它都能助您輕松實(shí)現(xiàn)設(shè)備間的通信交互,加速產(chǎn)品開發(fā)進(jìn)程。