【Protocol】一个简洁实用的自定义通信协议

简介: 【Protocol】一个简洁实用的自定义通信协议

Protocol

一个简洁实用的基于字节的自定义通信协议。

协议帧定义

/* Frame format definition */
typedef struct msg_frame
{
    uint32_t head;                   /* Frame header */
    uint8_t type;                    /* Device  ID */
    uint8_t cmd;                     /* Order code */
    uint16_t code;                   /* Function code */
    uint16_t datalen;                /* Data length */
    uint8_t data[MSG_FRAME_MAX_LEN]; /* Data storage area */
    uint16_t chkval;                 /* Check value */
    uint16_t tail;                   /* Frame end */
} msg_frame_t;

帧格式说明

说明 帧头 设备 ID 指令码 功能码 数据长度 数据存储区 校验值 帧尾
变量名 head type cmd code datalen data chkval tail
长度(Byte) 4 1 1 2 2 n 2 2

数据存储区最大长度,单位为字节。

#define MSG_FRAME_MAX_LEN   64

可处理有效数据最大长度,单位为字节。

#define MSG_BUF_MAX_LEN     96

帧头:有效数据的开始。

#define MSG_FRAME_HEAD0     0xED
#define MSG_FRAME_HEAD1     0xB9
#define MSG_FRAME_HEAD2     0x55
#define MSG_FRAME_HEAD3     0xAA

设备 ID:设备种类、地址或者设备类型

uint8_t type;

指令码:对设备的造作命令,如 open、close、read、write 等。

uint8_t cmd;

功能码:对指令码的进一步说明。

uint16_t code;

数据长度:数据存储区中数据的长度,单位为字节。

uint16_t datalen;

数据存储区:用来存储要传输的数据。

uint8_t data[MSG_FRAME_MAX_LEN];

校验值:基于 CRC 校验(可自定义)。

static uint16_t mc_check_crc16(const uint8_t *data, uint8_t len)
{
    uint16_t crc16 = 0xffff;
    uint8_t state, i, j;
    for(i = 0; i < len; i++ )
    {
        crc16 ^= data[i];
        for( j = 0; j < 8; j++)
        {
            state = crc16 & 0x01;
            crc16 >>= 1;
            if(state)
            {
                crc16 ^= 0xa001;
            }
        }
    }
    return crc16;
}

帧尾:有效数据的结束。

#define MSG_FRAME_TAil0     0x5A
#define MSG_FRAME_TAil1     0xA5

API 说明

数据解包

/* Packet decoding */
msg_pkg_t *unpkg_frame(const uint8_t *_msg_buf, const uint8_t size)

数据打包

/* Packet packaging */
msg_buf_t *pkg_frame(const msg_frame_t *_msg_pkg)

测试验证

测试环境:Visual Studio 2022 IDE

测试代码:

void pkg_test_cmd(void)
{
    kprintf("\r\n----- Packing and unpacking test begin -----\r\n");

    msg_frame_t my_frame = { 0x01, 0x02, 0xabcd, 0x8,
            {0x12, 0x34, 0x56,0x78, 0xab, 0xcd, 0xef, 0x5a} };

    uint8_t my_buf[] = { 0xed, 0xb9, 0x55, 0xaa, 0x0a, 0x2c, 0x80, 0x00,
            0x00, 0x04, 0x12, 0x34, 0xab, 0xcd, 0xe5, 0x50, 0x5a, 0xa5 };

    msg_buf_t* msg_buf = pkg_frame(&my_frame);
    msg_buf_print("frame to buffer test", msg_buf);

    msg_pkg_t* msg_pkg = unpkg_frame(msg_buf->buf_ptr, msg_buf->buf_size);
    msg_pkg_print("buffer to frame test", msg_pkg);

    msg_pkg = unpkg_frame(my_buf, sizeof(my_buf) / sizeof(uint8_t));
    msg_pkg_print("buffer to frame test", msg_pkg);

    kprintf("\r\n---- Packing and unpacking test end ---- \r\n");
}

运行结果:

----- Packing and unpacking test begin -----

frame to buffer test
size   (DEC):  22
data   (HEX):  ed b9 55 aa 01 02 ab cd 00 08 12 34 56 78 ab cd ef 5a 47 14 5a a5
state  (DEC):  0

buffer to frame test
type   (HEX):  01
cmd    (HEX):  02
code   (HEX):  ab cd
datalen(DEC):  8
data:  (HEX):  12 34 56 78 ab cd ef 5a
state: (DEC):  0

buffer to frame test
type   (HEX):  0a
cmd    (HEX):  2c
code   (HEX):  80 00
datalen(DEC):  4
data:  (HEX):  12 34 ab cd
state: (DEC):  0

---- Packing and unpacking test end ----
请按任意键继续. . .


代码获取

  • Github 仓库
相关文章
|
存储 开发框架 算法
【串口通信】使用C++和Qt设计和实现串口协议解析器(一)
【串口通信】使用C++和Qt设计和实现串口协议解析器
4442 0
|
网络协议 Windows
网络连接正常但百度网页打不开显示无法访问此网站解决方案
网络连接正常但百度网页打不开显示无法访问此网站解决方案
5139 0
网络连接正常但百度网页打不开显示无法访问此网站解决方案
|
8月前
|
人工智能 机器人 网络安全
2026年OpenClaw保姆级教程:OpenClaw(Clawdbot)部署+接入微信攻略
在2026年AI自动化办公与社交协同深度融合的浪潮中,OpenClaw(原Clawdbot,曾用名Moltbot)作为阿里云生态下开源的轻量级AI自动化代理工具,凭借自然语言交互、全场景任务自动化、插件化扩展的核心优势,成为个人办公提效、轻量团队协同、私域服务升级的优选工具。与传统聊天机器人不同,OpenClaw并非单纯的对话助手,而是能实现“需求解析-任务规划-工具调用-结果反馈”的完整自动化系统,可轻松完成文档生成、日程管理、网页抓取、多工具协同、信息汇总、私域客户响应等实操任务,真正实现解放双手、提升协作与服务效率的核心需求。
5487 1
|
7月前
|
测试技术 Go 芯片
2A单节锂电池充电芯片PW4213的IC测试应用
PW4213是一款专为单节锂电池(3.7V/4.2V)设计的同步降压型充电管理IC。与常见的5V输入充电芯片不同,PW4213支持宽电压输入(4.5V-15V),可直接使用5V-12V适配器为单节锂电池充电,内部集成同步降压架构,在大压差应用下效率高、发热低。 工作模式:降压(Buck)拓扑,将5V/9V/12V输入降压至4.2V给单节锂电池充电 开关频率:500kHz,可使用小型化电感电容 最大充电电流:2A,可通过外接检流电阻调节 封装形式:SOP8-EP(底部带散热焊盘)
|
存储 编解码 Prometheus
大模型推理加速实战:vLLM 部署 Llama3 的量化与批处理优化指南
本文详解如何通过量化与批处理优化,在vLLM中高效部署Llama3大模型。涵盖内存管理、推理加速及混合策略,提升吞吐量并降低延迟,适用于大规模语言模型部署实践。
2949 10
|
Ubuntu Linux 数据库
【Linux】深入了解Linux磁盘配额:限制用户磁盘空间的利器
【Linux】深入了解Linux磁盘配额:限制用户磁盘空间的利器
|
传感器 数据采集 监控
LabVIEW开发中的常见通讯协议详解
LabVIEW开发中的常见通讯协议详解
543 0
|
存储 弹性计算 人工智能
阿里云发票申请图文教程及常见问题解析
在购买完阿里云服务器或者其他云产品之后,如何申请发票成为了许多用户关注的焦点。尤其是对于初次购买阿里云服务器的用户来说,发票申请流程可能并不熟悉。本文将为大家详细介绍阿里云服务器购买之后如何申请发票,以及申请过程中可能遇到的常见问题,帮助大家轻松完成发票申请。
11495 2
|
监控 数据挖掘 API
京东商品历史价格 API 接口系列(京东 API)
本文介绍了如何使用京东开放平台API获取商品价格信息。首先,需注册账号并创建应用以获取App Key和App Secret,进而获取Access Token。准备好开发工具后,通过调用`jd.item_search`和`jd.item_get`接口,可以分别按关键字搜索商品和获取指定商品的详细信息及价格。示例代码展示了如何使用Python的requests库进行API请求。应用场景包括价格监控、商家定价策略、电商平台数据分析及商业智能决策支持。
1665 10
学生0元购|低配也能畅玩!《黑神话:悟空》云电脑攻略
《黑神话:悟空》正式上市,这款备受期待的游戏对电脑配置要求不低,但通过云电脑,你无需担心硬件限制,随时随地畅玩大作。最低仅需1.2元/小时,还能利用学生福利免费畅玩。快速上手教程与省钱攻略,助你轻松征服《黑神话:悟空》!
1288 8
学生0元购|低配也能畅玩!《黑神话:悟空》云电脑攻略