摘要:TinyFrame是一个简单的用于解析串口(如 UART、telnet、套接字等)通信数据帧的库。
本文分享自华为云社区《LiteOS组件尝鲜—玩转TinyFrame》,作者:Lionlace。
TinyFrame是一个简单的用于解析串口(如 UART、telnet、套接字等)通信数据帧的库。它可以灵活处理通信双方之间的消息会话、响应侦听者、校验及超时问题。该库允许注册侦听器(以回调函数形式)用于等待:任何帧、特定帧类型以及特定消息ID,这种高通用性的API可以满足绝大部分通信场景。
每个帧由帧头和payload组成。这两个部分都可以通过校验和来保护,以排除格式错误的报头(例如,错误的字段长度)或payload损坏的帧。帧中的所有字段大小都是可配置的。例如,用户可以更改配置文件中的某个字段TF_LEN_BYTES为不同值(1、2 或 4)。
,-----+-----+-----+------+------------+- - - -+-------------,
| SOF | ID | LEN | TYPE | HEAD_CKSUM | DATA | DATA_CKSUM |
| 0-1 | 1-4 | 1-4 | 1-4 | 0-4 | ... | 0-4 | <- size (bytes)
'-----+-----+-----+------+------------+- - - -+-------------'
SOF ......... start of frame, usually 0x01 (optional, configurable)
ID ......... the frame ID (MSb is the peer bit)
LEN ......... number of data bytes in the frame
TYPE ........ message type (used to run Type Listeners, pick any values you like)
HEAD_CKSUM .. header checksum
DATA ........ LEN bytes of data
DATA_CKSUM .. data checksum (left out if LEN is 0)
TinyFrame有 3 种侦听器类型,按优先顺序排列:
TinyFrame使用两个数据缓冲区:一个小的发送缓冲区和一个较大的接收缓冲区。发送缓冲区用于准备要发送的字节,可以一次全部发送;如果缓冲区不够大,则以循环方式发送。缓冲区必须只包含整个帧头,例如对于短消息,32字节即可。
LiteOS中提供了TinyFrameDemoTask来演示如何使用TinyFrame组件。目前支持在以下开发板上运行TinyFrameDemoTask。
接下来以TinyFrameDemo为例介绍TinyFrame的使用。
在TinyFrame_demo.c中主要实现3个功能:
在LiteOS源码根目录下执行make menuconfig命令,按如下菜单路径使能
TinyFrame Demo。
Demos --->
Utility Demo --->
[*] Enable TinyFrame Demo (NEW)
使能TinyFrame Demo后会自动使能TinyFrame组件。
保存退出后,会从github上自动下载TinyFrame源代码,并从gitee上下载适配LiteOS系统的patch包,并打入patch。
操作步骤如下:
********Hello Huawei LiteOS********
LiteOS Kernel Version : 5.1.0
Processor : Cortex-A9 * 4
Run Mode : SMP
GIC Rev : GICv1
build time : Dec 20 2021 11:30:07
**********************************
main core booting up...
OsAppInit
releasing 3 secondary cores
cpu 0 entering scheduler
cpu 3 entering scheduler
cpu 2 entering scheduler
cpu 1 entering scheduler
app init!
TinyFrame demo task start to run.
--------------------
TF_WriteImpl - sending frame:
1 01 .
128 80 .
0 00 .
7 07 .
1 01 .
240 F0 .
215 D7 .
108 6C l
105 69 i
116 74 t
101 65 e
111 6F o
115 73 s
0 00 .
213 D5 .
30 1E .
--- end of frame ---
GenericListener demo
Frame info
type: 01h
data: "liteos"
len: 7
id: 80h
--------------------
...
...
...