以stc85c52单片机写一个通讯接收处理,0x5a、0xa5为帧头,0x0f、0xf0为帧尾
时间: 2024-05-04 19:21:44 浏览: 12
好的,以下是一个简单的接收处理代码:
```c
#include <reg85.h>
#define FRAME_HEADER_1 0x5a
#define FRAME_HEADER_2 0xa5
#define FRAME_TAIL_1 0x0f
#define FRAME_TAIL_2 0xf0
unsigned char frame_buffer[256]; // 接收缓存区
unsigned char frame_index = 0; // 接收缓存区计数器
void uart_isr() interrupt 4 using 1 {
if (RI) {
RI = 0;
unsigned char data = SBUF;
if (data == FRAME_HEADER_1 && frame_index == 0) {
frame_buffer[frame_index++] = data;
} else if (data == FRAME_HEADER_2 && frame_index == 1) {
frame_buffer[frame_index++] = data;
} else if (frame_index > 1 && frame_buffer[0] == FRAME_HEADER_1 && frame_buffer[1] == FRAME_HEADER_2) {
frame_buffer[frame_index++] = data;
if (data == FRAME_TAIL_2 && frame_buffer[frame_index - 2] == FRAME_TAIL_1) {
// 接收完成,处理数据
// ...
// 清空缓存区
frame_index = 0;
}
} else {
// 错误,清空缓存区
frame_index = 0;
}
}
}
void main() {
TMOD = 0x20; // 定时器1工作在方式2
TH1 = 0xfd; // 波特率9600,定时器初值
TL1 = 0xfd; // 波特率9600,定时器初值
PCON &= 0x7f; // 波特率不加倍
SCON = 0x50; // 8位数据,可变波特率
ES = 1; // 开启串口中断
EA = 1; // 开启总中断
TR1 = 1; // 启动定时器1
while (1);
}
```
其中,`uart_isr` 是串口中断服务函数,当接收到数据时会执行该函数。
在函数中,首先判断接收到的数据是否为帧头,如果是则存入接收缓存区中,并将计数器加1。如果接收到的是第二个帧头,则表示一个新的帧开始接收,计数器加1。
如果计数器大于1,并且接收到了帧头,则表示正在接收帧中的数据。将数据存入接收缓存区中,并判断是否接收到了帧尾。如果接收到了帧尾,则表示接收完成,可以对接收到的数据进行处理。
如果接收到的数据不符合帧格式,则表示出现了错误,需要清空接收缓存区。
在处理完成后,需要将接收缓存区计数器清零,以便下次接收新的帧。