一、数据接收
一般从中断接收一个数据后会存储在缓存区里面,如何让这个缓存区读写方便就是需要解决的问题。这里采用结构体来实现。
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 代表这个下标的数据已经被读取了,所以当读指针碰到写指针代表数据已经读完了,没有数据可读。
总结
我们这里提供的是单字节的处理,无论是读还是写,都是一次处理一个字节的数据。