你是一个资深嵌入式工程师,帮我写一段自定义解析协议,固定协议是帧头(0xaa55)+从机地址(0x01)+命令(0xXX)+数据长度(len)+数据内容+CRC16,回复是帧头(0xaa55)+从机地址(0x01)+命令(0xXX)+数据长度(len)+数据内容+CRC16
时间: 2025-06-21 19:09:15 浏览: 24
### 自定义通信协议的实现
在嵌入式系统中,设计一个自定义通信协议通常需要考虑以下几个部分:帧头、从机地址、命令、数据长度、数据内容以及CRC16校验。以下是基于这些需求的具体实现。
#### 协议结构
假设协议的数据包格式如下:
- **帧头**:固定值 `0xaa55`。
- **从机地址**:设备地址,例如 `0x01`。
- **命令**:具体的操作指令,例如读取或写入。
- **数据长度**:实际传输数据的字节数。
- **数据内容**:具体的业务数据。
- **CRC16校验**:用于验证数据完整性。
#### CRC16计算函数
首先,提供一个通用的CRC16计算函数:
```c
#include <stdint.h>
uint16_t crc16(uint8_t *data_p, uint16_t length) {
uint16_t crc = 0xFFFF;
for (uint16_t i = 0; i < length; ++i) {
crc ^= data_p[i]; // XOR byte into least sig. byte of crc
for (uint8_t j = 0; j < 8; ++j) {
if ((crc & 0x0001) != 0) { // If the LSB is a 1,
crc >>= 1; // Shift right and XOR 0xA001
crc ^= 0xA001;
} else {
crc >>= 1; // Else shift right
}
}
}
return crc;
}
```
此函数实现了标准的CRC16算法[^1]。
#### 数据打包函数
接下来编写一个函数,将各个字段组合成完整的数据包:
```c
void create_packet(uint8_t command, uint8_t *data, uint8_t len, uint8_t *packet_buffer) {
packet_buffer[0] = 0xAA; // Frame Header High Byte
packet_buffer[1] = 0x55; // Frame Header Low Byte
packet_buffer[2] = 0x01; // Slave Address
packet_buffer[3] = command; // Command Code
packet_buffer[4] = len; // Data Length
memcpy(&packet_buffer[5], data, len); // Copy actual data content
uint16_t crc_value = crc16(&packet_buffer[2], len + 3);
packet_buffer[5 + len] = (uint8_t)(crc_value >> 8); // CRC High Byte
packet_buffer[5 + len + 1] = (uint8_t)crc_value; // CRC Low Byte
}
```
该函数按照指定顺序填充各字段,并调用CRC16函数生成校验码[^2]。
#### 使用示例
下面展示如何使用上述功能发送一条带有简单数据的消息:
```c
#include <stdio.h>
#include <string.h>
int main() {
uint8_t tx_data[] = {0x01, 0x02, 0x03}; // Example payload data
uint8_t buffer[256];
create_packet(0x0F, tx_data, sizeof(tx_data), buffer);
printf("Packet Content:\n");
for(int i = 0; i < 7 + sizeof(tx_data); i++) {
printf("%02X ", buffer[i]);
}
printf("\n");
return 0;
}
```
这段程序创建了一个包含三个字节有效负载的完整消息包,并打印其十六进制形式[^3]。
#### 接收端解包逻辑
接收端需逆向执行相同的过程来提取原始信息并验证CRC16值是否匹配。如果发现错误,则丢弃当前接收到的信息片段。
---
###
阅读全文
相关推荐


















