#include <stdio.h>
//空闲
#define IDLE 0
//忙
#define BUSY 1
//结束
#define END 2
#define HEAD 0x55
#define RCVMAX 18
typedef union rcv_struct
{
unsigned char data[20];
struct
{
unsigned char head;
unsigned char len;
unsigned char data[20];
unsigned char check;
unsigned char rcv_state;
unsigned char rcv_len;
}rcv_data;
}rcv_struct_t;
rcv_struct_t rcv_ctrl = {0};
void rcv_data(unsigned char data)
{
if(rcv_ctrl.rcv_data.rcv_state == IDLE)
{
if(data == HEAD)
{
rcv_ctrl.rcv_data.rcv_len = 0;
rcv_ctrl.rcv_data.len = 0;
rcv_ctrl.rcv_data.rcv_state = BUSY;
rcv_ctrl.rcv_data.head = data;
rcv_ctrl.rcv_data.rcv_len ++;
}
}
else if(rcv_ctrl.rcv_data.rcv_state == BUSY)
{
if(rcv_ctrl.rcv_data.rcv_len <= RCVMAX)
{
rcv_ctrl.data[rcv_ctrl.rcv_data.rcv_len ++] = data;
}
if((rcv_ctrl.rcv_data.rcv_len >= (char)((int)&rcv_ctrl.rcv_data.len - (int)&rcv_ctrl) ) && rcv_ctrl.rcv_data.rcv_len <= RCVMAX)
{
if(rcv_ctrl.rcv_data.rcv_len == rcv_ctrl.rcv_data.len)
{
rcv_ctrl.rcv_data.rcv_state = END;
return;
}
}
}
}
void print_rcv_data()
{
unsigned char i = 0;
printf("接收数据为:\n");
for(;i<rcv_ctrl.rcv_data.len;i++)
{
printf("%02x ",rcv_ctrl.data[i]);
}
}
int main()
{
unsigned char data = 0;
unsigned char xx = 0;
while (1)
{
printf("接收数据中....\n");
scanf("%hhx%c",&data,&xx);
rcv_data(data);
printf( " \n%2x %2x %2x %2x \n",(int)data,(int)rcv_ctrl.rcv_data.rcv_state,(int)rcv_ctrl.rcv_data.rcv_len,(int)rcv_ctrl.rcv_data.len);
if(rcv_ctrl.rcv_data.rcv_state == END)
{
print_rcv_data();
rcv_ctrl.rcv_data.rcv_state = IDLE;
}
}
}
我这里使用VSCode模拟出来的,实际用在单片机上是直接串口接收。只需根据串口数据自动接收不定长数据。