uart与uart之间的通信(队列缓存)

参考这篇文章,我认为写的很不错;我做了一些修改:防止队列满了后一帧数据分散开来,一部分在尾部,一部分在头部。

uart与uart之间的通信(队列缓存)_huangcheng188的博客-CSDN博客

int uart_receive_analysis(void)
{
    #define LEN 4       //最小的一帧数据具有的长度
    uint32_t count = sUART_REV_DATA_T.count;
    uint32_t header = sUART_REV_DATA_T.header;
    uint32_t tailer = sUART_REV_DATA_T.tailer;
    uint32_t length = 0;

    if(count >= LEN )
    {
        if(sUART_REV_DATA_T.buffer[(tailer + 0) % UART_BUF_LEN] == 0xAA &&
                sUART_REV_DATA_T.buffer[(tailer + 1) % UART_BUF_LEN] == 0x55)
        {
                length = sUART_REV_DATA_T.buffer[(tailer + 2) % UART_BUF_LEN];      //记录有效的长度
                if(count >= length+3)//为什么加3? 头+有效长度信息 0xAA 0x55 LEN 刚好是3
                {
                    data_copy(length+3);

                    sUART_REV_DATA_T.count = sUART_REV_DATA_T.count - length - 3;
                    sUART_REV_DATA_T.tailer = (sUART_REV_DATA_T.tailer + length + 3) % UART_BUF_LEN;
                    test++;
                    if(header > UART_BUF_LEN - 100)
                    {
                        //防止队列满了后一帧数据分散开来,一部分在尾部,一部分在头部。
                        sUART_REV_DATA_T.count = 0;
                        sUART_REV_DATA_T.header = 0;
                        sUART_REV_DATA_T.tailer = 0;
                    }
                    return 0;
                }
                else
                {
                    return -3;//不足一帧是继续等待,实际中可以做个超时处理
                }

        }
        else
        {
            sUART_REV_DATA_T.count = sUART_REV_DATA_T.count - 1;
            sUART_REV_DATA_T.tailer = (sUART_REV_DATA_T.tailer + 1) % UART_BUF_LEN;
            return -2;
        }
    }
    else
    {
        //防止队列满了后一帧数据分散开来,一部分在尾部,一部分在头部。
        if(header > UART_BUF_LEN - 100)
        {
            sUART_REV_DATA_T.count = 0;
            sUART_REV_DATA_T.header = 0;
            sUART_REV_DATA_T.tailer = 0;
        }
        return -1;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值