从帧边界识别到数据编码:嵌入式通信协议与数据序列化方案深度对比

帧格式

定义消息的边界和基本结构,确保接收端能完整提取一帧数据。主要用于“ 一条消息的边界 ”识别。帧格式在外层,定义报文头、长度、类型。

TLV (Type-Length-Value)

TLV 是一种常用的数据编码格式:

- T (Type):字段类型,表示这段数据的含义	
- L (Length):数据长度,表示这段数据有多长
- V (Value):具体的数据内容

它的核心目标是:

- 在字节流中自描述每一段数据的类型和长度
- 方便灵活扩展,新增字段不会破坏旧协议

基本结构:

Type Length Value
1字节 2字节 Length字节数据

Type:通常 1 个字节(可以扩展到 2 字节)
Length:表示 Value 的字节数,常用 1–2 字节

Value:实际数据,可以是字符串、数值、二进制块等

LV (Length-Value)

LV (Length-Value) 是一种非常简单的帧格式:

- L (Length):表示数据长度
- V (Value):实际数据内容

它的主要功能是解决帧边界问题,让接收端知道一帧数据从哪里开始、在哪里结束。
基本结构:

Length Value
2字节 Length字节数据

Length:通常 1–2 个字节,表示 Value 的字节数
Value:实际传输的数据,长度由 Length 决定

Delimited

Delimited(分隔符帧格式)指的是用特定的分隔符(Delimiter)标记一帧数据的开始或结束,从而让接收端知道一条消息在哪里结束,下一条从哪里开始。常见分隔符如下:

- 文本协议:"\n"、"\r\n"(如 HTTP 请求头、CSV 文件)
- 二进制协议:特定字节 0x7E(如 HDLC 协议用 0x7E 标记帧边界)

基本结构:

[ Data1 ] D

[ Data2 ] D

[ Data3 ] D

Data:一帧数据

D (Delimiter):分隔符,标记帧的边界

帧格式总结

帧结构 优点 缺点 串口适配性 典型场景
Delimited 实现最简单,用分隔符标记帧尾 需要转义,数据不能含分隔符 适合简单命令传输 文本协议、简单 AT 命令
LV 低开销,解析简单,性能好 不能灵活扩展,字段固定 适合固定结构数据 Modbus RTU、gRPC Frame
TLV 自描述性强,灵活,易扩展 帧头比 LV 稍大,解析略复杂 适合复杂、可扩展协议 BLE GATT、SNMP、IoT 自定义协议

根据不同的应用场景有不同的选择:

需求场景 推荐帧结构 原因
只传输简单命令或文本数据 Delimited 实现简单,调试方便
固定字段、性能优先 LV 长度前缀+负载,结构简单
多字段、未来可能扩展 TLV Type+Length+Value 自描述灵活
二进制+高可靠+复杂协议 TLV + CRC 校验 易扩展、可校验数据完整性

在工业控制、物联网里,常用的组合是:

[ 起始符 ] + [ 长度 ] + [ Type ] + [ Value ] + [ CRC ]

  • 起始符:标记帧开始,避免同步丢失
  • 长度:明确帧结束位置
  • Type+Value:支持多字段、可扩展
  • CRC:保证数据可靠

这样结合了 Delimited + LV + TLV 的优点,最通用,也最安全

数据序列化方案

定义帧内有效载荷数据如何编码成字节流,保证结构化数据可传输。将内存中的结构化数据(如对象、数组、字典等)转换为可存储、可传输的线性格式(通常是二进制流或文本字符串)的过程。

JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式, 基于键值对(key-value)表示数据 ,广泛用于前后端通信、配置文件、存储和物联网等场景。

示例:

{
   
   
  "name": "Alice",
  "age": 30,
  "isStudent": false,
  "scores": [95, 82, 77],
  "address": {
   
   
    "city": "New York",
    "zip": "10001"
  }
}

优点:

  • 易于阅读和调试
  • 跨语言支持广泛
  • 与 JavaScript 原生对象映射简单

缺点:

  • 体积较大:冗余键名,传输效率低
  • 解析速度较慢:文本解析比二进制慢
  • 类型有限:没有二进制数据类型,需要编码(如 Base64)
  • 无严格 Schema:容易出现字段缺失或类型不匹配问题

BSON

BSON一种基于 JSON 语法设计的二进制数据格式,最早由 MongoDB 推出,核心目标是解决 JSON 文本格式在数据传输和存储中的效率问题(如体积过大、解析速度慢)。与纯文本的 JSON 不同,BSON 通过二进制编码优化了数据存储结构,同时保留了 JSON 的 “键值对” 核心逻辑,兼顾了可读性(可解析为 JSON)和性能。

支持数据类型:

BSON 类型 对应 JSON 类型 说明
Double Number (浮点) 64 位浮点数
String String UTF-8 编码
Object Object 嵌套文档
Array Array 有序列表
Binary data - 原生二进制数据
ObjectId - MongoDB 特有唯一 ID
Boolean Boolean true/false
Date - 64 位整数,表示 UTC 时间戳
Null Null 空值
Int32 Number 32 位整数
Int64 Number 64 位整数
Decimal128 Number 高精度浮点数

示例:

{
   
   
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值