串口接收数据的处理方法

一、数据接收

一般从中断接收一个数据后会存储在缓存区里面,如何让这个缓存区读写方便就是需要解决的问题。这里采用结构体来实现。

1.1 初始化结构体

typedef struct _RingBuf
{
    unsigned read_index;
    unsigned write_index;
    unsigned buffer_size;
    unsigned char *buffer;
} RingBuf;

void RingBufInit(RingBuf* rb, unsigned char* buf, unsigned size)
{
    if (rb != 0) {
        rb->read_index = 0;
        rb->write_index = 0;
        rb->buffer_size = size;
        rb->buffer = buf;
    }
}

初始化这个结构体,参数rb 、buf 要传入为非局部变量,接下来就可以创造我们的接收处理函数了。

1.2 数据接收处理函数

int RingBufPutChar(RingBuf* rb, unsigned char element)
{
    unsigned local_write = rb->write_index;
    ++local_write;
    if (local_write == rb->buffer_size)
        local_write = 0;

    if (local_write != rb->read_index) {
        rb->buffer[local_write] = element;
        rb->write_index = local_write;
        return 1;
    }
    return 0;
}

这个接收区会从下标1开始存储数据,存满后会从下标0开始存储。不断循环,读写指针不重合,防止数据接收与读写冲突。

二、数据读取

2.1、读取数据函数

int RingBufGetChar(RingBuf* rb, unsigned char *result)
{
    unsigned local_read = rb->read_index;
    if (local_read == rb->write_index)
        return 0;

    ++local_read;

    if (local_read == rb->buffer_size)
        local_read = 0;

    *result = rb->buffer[local_read];

    rb->read_index = local_read;//已经读取,移动读指针
    return 1;
}

这里需要注意read_index 代表这个下标的数据已经被读取了,所以当读指针碰到写指针代表数据已经读完了,没有数据可读。

总结

我们这里提供的是单字节的处理,无论是读还是写,都是一次处理一个字节的数据。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值