【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 仓库
相关文章
|
搜索推荐 算法 数据挖掘
# 【推荐系统入门到项目实战】(三):矩阵分解和ALS算法
# 【推荐系统入门到项目实战】(三):矩阵分解和ALS算法
# 【推荐系统入门到项目实战】(三):矩阵分解和ALS算法
|
Java 数据库连接 Spring
SpringBoot启动类的扫描注解的用法及冲突原则
SpringBootApplication 注解 这是 SpringBoot 的注解,本质是三个 Spring 注解的和 @Configuration @EnableAutoConfiguration @ComponentScan 它默认扫描启动类所在包及其所有子包,但是不包括第三方的 jar 包的其他目录,通过scanBasePackages 属性可以重新设置扫描包路径。 注意:如果我们需要扫描依赖 jar 包中的注解,而依赖包的路径跟不包含在 SpringBoot 启动类路径中的话,我们就要单独使用 @ComponentScan 注解扫描第三方包。同时必须指定本工程的扫描路径,因
1237 0
SpringBoot启动类的扫描注解的用法及冲突原则
【PCIe 协议】听说你做 PCIe 很多年,还不知道 PCIe Hierarchy ID 是什么 ???
【PCIe 协议】听说你做 PCIe 很多年,还不知道 PCIe Hierarchy ID 是什么 ???
1061 0
【PCIe 协议】听说你做 PCIe 很多年,还不知道 PCIe Hierarchy ID 是什么 ???
|
数据采集 人工智能 Rust
『GitHub项目圈选周刊01』一款构建AI数字人项目开源了!自动实现音视频同步!
『GitHub项目圈选周刊01』一款构建AI数字人项目开源了!自动实现音视频同步!
2128 0
|
机器学习/深度学习 传感器 物联网
【Python机器学习专栏】机器学习在物联网(IoT)中的集成
【4月更文挑战第30天】本文探讨了机器学习在物联网(IoT)中的应用,包括数据收集预处理、实时分析决策和模型训练更新。机器学习被用于智能家居、工业自动化和健康监测等领域,例如预测居民行为以优化能源效率和设备维护。Python是支持物联网项目机器学习集成的重要工具,文中给出了一个使用`scikit-learn`预测温度的简单示例。尽管面临数据隐私、安全性和模型解释性等挑战,但物联网与机器学习的结合将持续推动各行业的创新和智能化。
468 1
|
12月前
|
SQL 自然语言处理 数据库
XiYan-SQL:一种多生成器集成的Text-to-SQL框架
XiYan-SQL 是一种创新的多生成器集成Text-to-SQL框架,通过M-Schema增强模型对数据库结构的理解,结合ICL与SFT方法提升SQL生成质量和多样性,经实验证明在多个数据集上表现优异,特别是在Spider和SQL-Eval上取得了领先成绩。
2038 7
|
12月前
|
SQL 数据可视化 关系型数据库
开源低代码平台推荐!10款优秀的开源低代码平台!
本文介绍了10款免费开源低代码开发平台,包括JeeLowCode、Ample、WaveMaker等,它们通过减少代码编写量,提供高效、灵活的开发工具,帮助企业快速构建复杂应用,支持企业数字化转型。各平台特色鲜明,适用于不同开发需求和应用场景。
|
Linux
Linux Crontab 查看定时任务启动没
【10月更文挑战第20天】在Linux系统中,crontab用于设置周期性执行的任务。查看当前用户的Crontab任务列表,使用`crontab -l`;查看所有用户任务,使用`sudo crontab -l`或指定用户`sudo crontab -u username -l`。
633 5
|
存储 人工智能 搜索推荐
生成式 AI 与 LangCHain(一)(3)
生成式 AI 与 LangCHain(一)
592 2
|
安全 算法 数据库
MD5、SHA、DES、AES、RSA的算法说明
【5月更文挑战第10天】MD5、SHA、DES、AES、RSA的算法说明
1148 2