简单协议的打包和解包源代码,STM32F103RCT6单片机实现,将48位带帧头帧尾AD采集的数据打包后通过串口发送出去
时间: 2024-05-16 09:18:07 浏览: 91
以下是一个简单的协议打包和解包的示例代码,可以在STM32F103RCT6单片机上使用。假设要发送的数据为48位,其中包括4位帧头、40位数据和4位帧尾。
```c
#define FRAME_HEAD 0xA5
#define FRAME_TAIL 0x5A
#define DATA_SIZE 5 // 40位数据需要分成5个字节发送
typedef struct {
uint8_t head;
uint8_t data[DATA_SIZE];
uint8_t tail;
} DataPacket;
void packData(uint64_t rawData, uint8_t* buffer) {
DataPacket packet;
packet.head = FRAME_HEAD;
packet.tail = FRAME_TAIL;
// 将40位数据分成5个字节
for (int i = 0; i < DATA_SIZE; i++) {
packet.data[i] = (rawData >> (8 * i)) & 0xFF;
}
// 将打包后的数据写入缓冲区
memcpy(buffer, &packet, sizeof(DataPacket));
}
uint64_t unpackData(uint8_t* buffer) {
DataPacket* packet = (DataPacket*)buffer;
// 检查帧头和帧尾
if (packet->head != FRAME_HEAD || packet->tail != FRAME_TAIL) {
return 0;
}
// 将5个字节的数据合并成一个64位整数
uint64_t rawData = 0;
for (int i = 0; i < DATA_SIZE; i++) {
rawData |= ((uint64_t)packet->data[i]) << (8 * i);
}
return rawData;
}
```
在发送数据时,可以使用`packData()`函数将原始数据打包成一个带有帧头和帧尾的数据包,并将其写入串口缓冲区。示例代码如下:
```c
uint64_t rawData = 0x123456789ABCDE;
uint8_t buffer[sizeof(DataPacket)];
packData(rawData, buffer);
HAL_UART_Transmit(&huart1, buffer, sizeof(DataPacket), HAL_MAX_DELAY);
```
接收数据时,可以先检查接收到的数据包是否符合协议要求,再使用`unpackData()`函数从数据包中提取原始数据。示例代码如下:
```c
uint8_t buffer[sizeof(DataPacket)];
HAL_UART_Receive(&huart1, buffer, sizeof(DataPacket), HAL_MAX_DELAY);
uint64_t rawData = unpackData(buffer);
if (rawData != 0) {
// 成功解包数据
} else {
// 数据包格式错误
}
```
需要注意的是,以上代码仅作为示例,实际使用时需要根据具体情况进行修改和优化。例如,可以添加数据校验码、错误处理等功能,以提高协议的鲁棒性和可靠性。
阅读全文