电子产业一站式赋能平台

PCB联盟网

搜索
查看: 435|回复: 0
收起左侧

嵌入式 Linux 对接星闪,用 C++ 设计一个通用的 AT 指令解析器。

[复制链接]

568

主题

568

帖子

4219

积分

四级会员

Rank: 4

积分
4219
发表于 2024-10-20 11:59:00 | 显示全部楼层 |阅读模式
我是老温,一名热爱学习的嵌入式工程师
4 r* s6 @, q; |! J  f0 M3 `关注我,一起变得更加优秀!
& s6 o7 o3 Z: {4 C5 `  R, e" ]为了可以让嵌入式Linux产品方便地对接AT指令通信模组,我们在设计嵌入式应用程序的时候,可以用 C/C++ 设计一个通用的AT指令解析器,这个AT指令解析器具有以下特性:
$ S, w2 n0 W1 x5 e9 `% d1、使用UART串口进行硬件连接通信。2、AT指令容易扩展,提供处理函数的注册接口。3、通过队列进行指令管理,发送、接收、处理、多线程同步互斥。4、具有超时重发机制,可设置超时时间与重发次数。5、面向对象设计,高内聚,容易移植使用。; _# y" ?$ q1 @$ J! r% D- h# d
前段时间,小熊派官方发布了星闪核心板 Bearpi-Pico H2821 的AT指令固件,并且支持 1 对 8 组网通信,有了丰富的AT指令集,单片机或者其他MPU芯片就可以很容易地通过星闪网络进行互联通信。" c* Y7 [" ^! ?6 x% v$ N$ D; l) o
关于星闪 AT 固件的详情,可以查看之前的文章进行回顾:开启星闪互联,组建一对多小型网络!, }4 R! D7 X2 @  q: z

b5tsd0d15eh64022643033.jpg

b5tsd0d15eh64022643033.jpg

9 x0 b  K# A+ z9 U/ z; D, U这个通用的 AT 指令解析器主要由以下两部分组成:串口通信模块 serial_port,AT指令解析器模块 at_cmd_paeser,以下是解析器的具体设计过程。
4 {4 |# w" {* B0 B. S" H: ]( S1、头文件 serial_port.h 主要提供底层串口硬件的操作接口,包括配置串口,打开或关闭串口,数据发送和接口,以及判断串口是否已经打开,具体代码如下图所示。
5 ~2 U8 \  W% M$ P

1f5e1fqwoog64022643133.png

1f5e1fqwoog64022643133.png
- \8 w, V" i0 A% P) \
2、源文件 serial_port.cpp 主要是实现底层串口硬件的操作逻辑,相关的操作都通过 termios 提供的接口进行实现,串口硬件在配置或者数据收发时,要先判断 is_port_opened 是否置位,串口成功打开后才能进行相关的操作。
9 o8 V" E! ]" D. u# N0 X

kveostk2isb64022643234.png

kveostk2isb64022643234.png
4 W( P( w1 ], E0 r" y' M
: ]2 x; i! D4 [6 }! `; r+ w6 x

1 [5 A/ `1 Q2 C# a4 E

uibk3co3dnb64022643334.png

uibk3co3dnb64022643334.png

6 e( K* P; m4 R. {7 M4 e3 f; Y& A& c# p) Y2 @" X0 o

awdgtlbzurs64022643434.png

awdgtlbzurs64022643434.png
$ d9 A3 y  L) K, r* H, D8 ~
3、头文件 at_cmd_parser.h 主要是把AT 指令解析器抽象成一个类 class at_cmd_parser,这个类提供了AT指令和处理函数的注册接口,解析器的启停,AT指令发送,三个线程,数据收发队列,互斥锁与条件变量,等等。& t+ p6 Q' ~. A" O/ y  K

d4pwexbl14y64022643534.png

d4pwexbl14y64022643534.png

: ?! N& d( ~9 `/ g4、源文件 at_cmd_parser.cpp 主要是对解析器类的接口实现,构造函数主要是打开和配置串口,start() 和 stop() 函数主要是启动和停止三大线程,代码实现如下图所示。
5 G) `. {9 N! k: _% z6 w0 D; t8 ?3 T

euwebkikb4z64022643635.png

euwebkikb4z64022643635.png
% m$ h2 v; P' `( g
5、函数 add_command_handler() 主要是把AT指令和处理函数进行注册绑定,把处理函数用一个哈希表 command_handler 进行管理,AT指令的字符串是键key,具体的处理函数是健对应的值value。0 F, l4 R' _4 I) h7 G

jowb21poqjd64022643735.png

jowb21poqjd64022643735.png
( |( T  m0 T0 `* c8 x% t3 \
6、调用 send_at_cmd() 函数发送 AT 指令,在这个函数里面,主要是把待发送的AT指令放入队列 send_queue,入队列采用互斥锁保护,然后调用 send_cv 事件唤醒发送线程 send_thread() 进行指令发送。8 b' c/ f7 n: v+ f

dxrhggtxc1q64022643835.png

dxrhggtxc1q64022643835.png

% \' t5 [2 J- X0 v7、在发送线程 send_thread() 里面,先获取 send_mtx 互斥锁,然后等待send_cv信号的到达,使用for循环不断从send_queue里面取出 struct at_command 类型的数据,然后调用 serial.send_data() 进行发送。
) t3 C+ t7 t& |

1jvnfthsln464022643935.png

1jvnfthsln464022643935.png
! M$ k  M( g% n+ z1 N1 }* I/ r
在发送AT指令之前,先记录发送前的时间点,超过一定时间之后还没有收到当前AT指令的正确回复,则会继续重新发送并记录重发次数,达到最大重发次数后,丢弃该条AT指令。- ^  q' n2 |; r2 i' T# S
8、在数据接收线程 receiving_thread() 里面,每隔100ms轮询读取串口缓冲区,如果读取到数据,先尝试获取互斥锁,并把数据存入 recv_queue 接收队列,然后发送 recv_cv 事件唤醒数据处理线程 processing_thread() . Q0 Q. F3 t" Y8 U' o( `3 |& R) k, v

4ayql4g2jhk64022644035.png

4ayql4g2jhk64022644035.png
+ x: _+ x, g$ I* d# ]0 ?& H
9、在数据处理线程 proessing_thread() 里面,获取数据接收互斥锁,然后等待收到 recv_cv 事件后,从数据接收队列 revv_queue 里面取出数据,不断从 command_handler 哈希表里进行键值匹配,执行对应的注册函数,执行成功后,把该条AT指令从发送队列里面删除。- ~3 g, n" f) B# I7 m

kdmsg13jnmm64022644135.png

kdmsg13jnmm64022644135.png
, I) O% g: {4 `- d) `/ T
10、把星闪核心板 Bearpi-Pico H2821 通过USB接口连接到Linux开发板上面,开发板的内核需要支持CH34x驱动,会在/dev 目录下生成 ttyUSB0 节点,我们可以做一个简单的界面来进行指令发送,点击【指令:AT】按钮,可以看到调试终端输出打印信息,AT指令解析器可以在开发板上面顺利运行。6 r8 ?% J7 U5 I: F

rhreaxi3plr64022644236.png

rhreaxi3plr64022644236.png

- b! P7 |+ ^0 h' G% p  d- P8 c下一步,我们将会基于这个通用的 AT 指令解析器,把星闪核心板BearPi-Pico H2821的 AT 指令都集成到一个模块组件里面,通过这个组件,就可以让嵌入式 Linux 开发板轻松获得星闪通信功能。
. W& \' r8 a2 C( o. o( H7 Q# C-END-
$ T: \! n1 l" I: z往期推荐:点击图片即可跳转阅读4 v1 t! z: s9 G
3 K: h: o) L2 _# e4 ]
/ `/ c$ d4 o+ W* M
                                                       
2 [+ s' b& x& f1 G$ ~) O! i                                                                2 M: A, n9 U. b# w6 ?
                                                                       
1 C6 ?0 k0 ?7 g  h$ k                                                                               
+ v) `- Z  T( c# g5 m9 I) \; Q& ~& S3 F

0ydacxmfplt64022644336.jpg

0ydacxmfplt64022644336.jpg
' M( C: P' e$ q3 m4 T1 F5 r  G
                                                                               
( b* s  ^4 N7 ~& G, a" l                                                                                        开启星闪互联,组建一对多小型网络!
5 u% _/ a+ i7 B2 j. P                                                        2 j$ l5 w4 Z" G4 W9 r* {
                                                               
2 }) t5 A3 M% w) |* _                                                                        + ~0 M" W) j0 D& h4 {$ V1 z5 U' L
                                                                               
# t" r2 t( ], D5 `( m9 k

14w22t5cjce64022644436.jpg

14w22t5cjce64022644436.jpg
8 {; p' n# R- Q- W* ~
                                                                                2 \, M2 k5 }9 q6 c3 U
                                                                                        现场实测,用数据说话,星闪通信距离突破3.3公里!
9 D- X. H" m, [" d8 O                                                                7 i  I: g% B- m+ t6 P2 K$ Z2 y
                                                                        0 u$ l" i. }! |+ g6 A
                                                                                . E$ D! w" ^- r8 Y: x0 x

i0t3bitb11n64022644537.jpg

i0t3bitb11n64022644537.jpg
9 y6 S( r: D, [1 l' w3 d8 M
                                                                               
$ O8 h' f- d, q7 G                                                                                        【分享】好玩的嵌入式 AI ,机器视觉和音视频处理; X: E* p, d$ ?1 f) ~
                                                                               
: T) q- n) q/ @7 Y. A8 J" z                                                                       
7 t5 ~0 j2 i7 s; U6 F! l                                                               
- ^0 P1 {; V. K  u                                                        我是老温,一名热爱学习的嵌入式工程师! w; a1 Z- S, f: F/ B
关注我,一起变得更加优秀!
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表