電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 38|回復(fù): 0
收起左側(cè)

嵌入式 Linux 對接星閃,用 C++ 設(shè)計(jì)一個(gè)通用的 AT 指令解析器。

[復(fù)制鏈接]

447

主題

447

帖子

492

積分

一級會(huì)員

Rank: 1

積分
492
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 前天 11:59 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師
" D7 h2 t+ T  F  ]+ v! K9 k' t1 t9 [關(guān)注我,一起變得更加優(yōu)秀!/ o7 d( X1 D) z$ U% I
為了可以讓嵌入式Linux產(chǎn)品方便地對接AT指令通信模組,我們在設(shè)計(jì)嵌入式應(yīng)用程序的時(shí)候,可以用 C/C++ 設(shè)計(jì)一個(gè)通用的AT指令解析器,這個(gè)AT指令解析器具有以下特性:
- p% W9 s* k* b' q: ?1、使用UART串口進(jìn)行硬件連接通信。2、AT指令容易擴(kuò)展,提供處理函數(shù)的注冊接口。3、通過隊(duì)列進(jìn)行指令管理,發(fā)送、接收、處理、多線程同步互斥。4、具有超時(shí)重發(fā)機(jī)制,可設(shè)置超時(shí)時(shí)間與重發(fā)次數(shù)。5、面向?qū)ο笤O(shè)計(jì),高內(nèi)聚,容易移植使用。
  B& U& L- e3 e" O  j0 S# r4 f  n前段時(shí)間,小熊派官方發(fā)布了星閃核心板 Bearpi-Pico H2821 的AT指令固件,并且支持 1 對 8 組網(wǎng)通信,有了豐富的AT指令集,單片機(jī)或者其他MPU芯片就可以很容易地通過星閃網(wǎng)絡(luò)進(jìn)行互聯(lián)通信。( q  _: f8 V8 P6 R% a9 b( |$ V3 g
關(guān)于星閃 AT 固件的詳情,可以查看之前的文章進(jìn)行回顧:開啟星閃互聯(lián),組建一對多小型網(wǎng)絡(luò)!
9 W! _3 H' X5 S. @6 e) @3 O : D; C8 Y& T8 C) y7 i
這個(gè)通用的 AT 指令解析器主要由以下兩部分組成:串口通信模塊 serial_port,AT指令解析器模塊 at_cmd_paeser,以下是解析器的具體設(shè)計(jì)過程。( i- U! E% N: G6 J( P; b: Z  I; V1 M
1、頭文件 serial_port.h 主要提供底層串口硬件的操作接口,包括配置串口,打開或關(guān)閉串口,數(shù)據(jù)發(fā)送和接口,以及判斷串口是否已經(jīng)打開,具體代碼如下圖所示。
! _2 Q' x5 T  {/ R: s2 Y
7 q6 Z: }5 M6 J8 Y2、源文件 serial_port.cpp 主要是實(shí)現(xiàn)底層串口硬件的操作邏輯,相關(guān)的操作都通過 termios 提供的接口進(jìn)行實(shí)現(xiàn),串口硬件在配置或者數(shù)據(jù)收發(fā)時(shí),要先判斷 is_port_opened 是否置位,串口成功打開后才能進(jìn)行相關(guān)的操作。
1 W$ r" e. X7 y # _4 \( B  S# H; ?5 G9 B7 V
, ?% m9 d8 I% c" F" K4 g5 `; }! p

4 y# E5 J# f1 m* x5 m# S
% n/ `; ?/ Z+ d% q- V& u4 @% \3 F) `9 ]7 f4 O. l! Z

2 Y) n) d1 {( B- ]# k) q3、頭文件 at_cmd_parser.h 主要是把AT 指令解析器抽象成一個(gè)類 class at_cmd_parser,這個(gè)類提供了AT指令和處理函數(shù)的注冊接口,解析器的啟停,AT指令發(fā)送,三個(gè)線程,數(shù)據(jù)收發(fā)隊(duì)列,互斥鎖與條件變量,等等。
2 z  O* i4 \' n" N 5 N, d- M& }$ w+ e! D7 g
4、源文件 at_cmd_parser.cpp 主要是對解析器類的接口實(shí)現(xiàn),構(gòu)造函數(shù)主要是打開和配置串口,start() 和 stop() 函數(shù)主要是啟動(dòng)和停止三大線程,代碼實(shí)現(xiàn)如下圖所示。
1 b$ z) `) D" _& L  u ' @1 N1 n- G: x, _, e; X- B
5、函數(shù) add_command_handler() 主要是把AT指令和處理函數(shù)進(jìn)行注冊綁定,把處理函數(shù)用一個(gè)哈希表 command_handler 進(jìn)行管理,AT指令的字符串是鍵key,具體的處理函數(shù)是健對應(yīng)的值value。
# h5 S; Q5 D$ j
" h0 I" y! m8 e* g6、調(diào)用 send_at_cmd() 函數(shù)發(fā)送 AT 指令,在這個(gè)函數(shù)里面,主要是把待發(fā)送的AT指令放入隊(duì)列 send_queue,入隊(duì)列采用互斥鎖保護(hù),然后調(diào)用 send_cv 事件喚醒發(fā)送線程 send_thread() 進(jìn)行指令發(fā)送。
* v' f% |+ I& F4 S& X8 { , I3 L3 O- d" p" s. _
7、在發(fā)送線程 send_thread() 里面,先獲取 send_mtx 互斥鎖,然后等待send_cv信號的到達(dá),使用for循環(huán)不斷從send_queue里面取出 struct at_command 類型的數(shù)據(jù),然后調(diào)用 serial.send_data() 進(jìn)行發(fā)送。
$ R0 H$ {% k4 G( l$ \9 C , |* R0 r4 W: r2 M
在發(fā)送AT指令之前,先記錄發(fā)送前的時(shí)間點(diǎn),超過一定時(shí)間之后還沒有收到當(dāng)前AT指令的正確回復(fù),則會(huì)繼續(xù)重新發(fā)送并記錄重發(fā)次數(shù),達(dá)到最大重發(fā)次數(shù)后,丟棄該條AT指令。/ ~  r* J9 t* i; c9 t- Y
8、在數(shù)據(jù)接收線程 receiving_thread() 里面,每隔100ms輪詢讀取串口緩沖區(qū),如果讀取到數(shù)據(jù),先嘗試獲取互斥鎖,并把數(shù)據(jù)存入 recv_queue 接收隊(duì)列,然后發(fā)送 recv_cv 事件喚醒數(shù)據(jù)處理線程 processing_thread()
: n, L4 n7 U7 Q0 r
2 z5 M7 j0 f6 g) \9、在數(shù)據(jù)處理線程 proessing_thread() 里面,獲取數(shù)據(jù)接收互斥鎖,然后等待收到 recv_cv 事件后,從數(shù)據(jù)接收隊(duì)列 revv_queue 里面取出數(shù)據(jù),不斷從 command_handler 哈希表里進(jìn)行鍵值匹配,執(zhí)行對應(yīng)的注冊函數(shù),執(zhí)行成功后,把該條AT指令從發(fā)送隊(duì)列里面刪除。' E4 q0 l4 }0 U# z5 X
6 }7 F1 D3 K. o1 m9 p4 p
10、把星閃核心板 Bearpi-Pico H2821 通過USB接口連接到Linux開發(fā)板上面,開發(fā)板的內(nèi)核需要支持CH34x驅(qū)動(dòng),會(huì)在/dev 目錄下生成 ttyUSB0 節(jié)點(diǎn),我們可以做一個(gè)簡單的界面來進(jìn)行指令發(fā)送,點(diǎn)擊【指令:AT】按鈕,可以看到調(diào)試終端輸出打印信息,AT指令解析器可以在開發(fā)板上面順利運(yùn)行。
; O" |7 \1 P* t4 }
% F) ^1 B6 b( _2 {& r. y' s0 w6 d: r下一步,我們將會(huì)基于這個(gè)通用的 AT 指令解析器,把星閃核心板BearPi-Pico H2821的 AT 指令都集成到一個(gè)模塊組件里面,通過這個(gè)組件,就可以讓嵌入式 Linux 開發(fā)板輕松獲得星閃通信功能。8 y! i9 \* ]; b+ [( i: A: n! `
-END-5 d2 l0 Z+ w, b8 O$ M$ l
往期推薦:點(diǎn)擊圖片即可跳轉(zhuǎn)閱讀
- a% @% h3 L2 X* t$ Z( j. A
7 W! s* Q! J+ H1 l. k

3 m. T% ~8 d! E                                                        , b$ `! O; H5 |. }/ ^
                                                               
1 C$ U" P. ?4 _) g! D                                                                       
9 l6 l# @8 I& h0 ~. h                                                                                - H+ R( I& {: D  @, U' E; D
) {1 [7 D1 n7 \. U# ?( v
                                                                               
, {, a( w+ R9 l# |; u( [2 W, y* `                                                                                        開啟星閃互聯(lián),組建一對多小型網(wǎng)絡(luò)!/ q2 c4 u" E& e; Z4 Y' ?. p
                                                       
( Z5 i0 S& a, i9 i' t( o9 i3 a                                                               
+ d# E. x( a$ g2 ]2 X" o! g! _                                                                       
% j- b, P' N# |                                                                               
! c' L. ~  C0 u7 ], U; D ( a+ Z+ ?/ f4 I& }. t0 m% v6 h
                                                                                2 ?/ ^/ j. S7 @
                                                                                        現(xiàn)場實(shí)測,用數(shù)據(jù)說話,星閃通信距離突破3.3公里!$ O" L5 a" q* N3 w0 X& ~, y
                                                               
3 q5 M6 `0 j* v; T/ W9 t                                                                       
6 L  o7 U& O! a8 {                                                                               
% t. i6 ~8 \; |, e 0 o" n, U; `% h3 t3 Q
                                                                                % l3 F: @2 p* _
                                                                                        【分享】好玩的嵌入式 AI ,機(jī)器視覺和音視頻處理
1 m, h8 r* Q9 c% V# g                                                                                - w5 N' \  k% g# U
                                                                        8 U% b; A1 u! F7 I
                                                               
7 _' i/ p" X7 G. b# L! s/ V, |9 J                                                        我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師
2 B. Y. ?% j% r3 z1 Z: L& |: k關(guān)注我,一起變得更加優(yōu)秀!

發(fā)表回復(fù)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

關(guān)閉

站長推薦上一條 /1 下一條


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表