根据上面代码 增加 判断 帧头 帧尾
时间: 2024-09-07 11:06:53 浏览: 37
在上述代码的基础上,如果你想要添加帧头和帧尾的检查,你可以这样做。首先假设我们有一个固定的帧头和帧尾标识,例如`START_BYTE`表示帧头,`END_BYTE`表示帧尾。以下是修改后的部分代码:
```c
// 假设帧头和帧尾的字节
#define START_BYTE 0x5A
#define END_BYTE 0x7D
// 用于临时存储完整帧的数据
static uint8_t frame_buffer[FRAME_LENGTH];
// 修改接收函数
void USART_IRQHandler(void) {
if (USART_GetITStatus(USART1, USART_IT_RXNE)) { // 检查是否接收到新的数据
uint8_t data = USART_ReceiveData(USART1); // 获取新数据
// 检查是否接收到帧头
if (data == START_BYTE && !frame_buffer_sent) {
frame_buffer[frame_head_index++] = data; // 开始保存帧数据
frame_head_index %= FRAME_LENGTH; // 保持索引在合法范围内
frame_buffer_sent = true; // 标记开始发送帧
} else if (data == END_BYTE && frame_buffer_sent) { // 接收到帧尾
insert_to_queue(&usartQueue, frame_buffer); // 将完整帧放入队列
frame_buffer_sent = false; // 清除发送标记
frame_head_index = 0; // 重置帧头指针
} else if (frame_buffer_sent) { // 正在发送帧期间,继续保存数据
frame_buffer[frame_head_index++] = data; // 存储当前数据
}
}
}
// 新增判断和处理帧数据的部分
void handle_received_frame(uint8_t* buffer, size_t length) {
if (length > 0 && buffer[length - 1] == END_BYTE) {
for (size_t i = 0; i < length - 1; i++) {
handle_received_data(buffer[i]); // 处理帧内数据
}
// 处理完整的帧数据
} else {
// 接收到的不是一个完整的帧,忽略或丢弃
printf("Invalid frame detected.\n");
}
}
// 修改主循环,现在在处理数据之前先检查队列内的帧
while (1) {
if (!is_empty(&usartQueue)) {
uint8_t* frame = dequeue_from_queue(&usartQueue);
handle_received_frame(frame, sizeof(frame)); // 解析并处理帧
free(frame); // 释放内存
}
}
```
在这个改动中,我们在接收函数中增加了帧头和帧尾的判断,并在接收到帧尾时调用`handle_received_frame`函数来处理完整帧。同时,在主循环中,处理队列数据前会先解析帧。
阅读全文