无空闲中断根据协议长度接受不定长数据


#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模拟出来的,实际用在单片机上是直接串口接收。只需根据串口数据自动接收不定长数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值