接收队列 ,空闲中断,数据不定长。
随意编了一个程序,稳定性待测试。
.h
////串口接收缓存列队
#define UQ4_LEN 2048 //定义最大接收字节数
#define UQ4_N_LEN 500 //定义最大接收字节数
#define FLASE 1
#define TRUE 0
typedef struct _BufQueue_
{
unsigned int head;
unsigned int tail;
unsigned int len;
unsigned char buf[UQ4_LEN];
unsigned int n_head;
unsigned int n_tail;
unsigned int n_len;
unsigned int n_buf_num[UQ4_N_LEN];
unsigned int n_buf_addr[UQ4_N_LEN];
}_BufQueue;
extern _BufQueue UQ4;
void RingBuff_Init(void);
u8 n_Write_RingBuff(u16 data,u8 * buf);
u8 n_Read_RingBuff(int *len,u8 *buf);
.c:
_BufQueue UQ4;
void QInit(void )
{
UQ4.head=0;
UQ4.tail=0;
UQ4.n_head=0;
UQ4.n_tail=0;
UQ4.n_len=0;
UQ4.len=0;
}
/*
采用普通队列
*/
//记录帧长, 帧地址
/*
串口的空闲中断服务函数里面调用
len 帧长度
buf 数组传入
*/
u8 n_Write_RingBuff(u16 len,u8 * buf)
{
if(UQ4.n_len >= UQ4_N_LEN) //1、判断缓冲区是否已满
{
return FLASE;
}
if((UQ4.tail+len)<(UQ4_LEN-1)) memcpy(&UQ4.buf[UQ4.tail],buf,len); //队列尾部+新数据长度 如果 未超过数组长度,则直接复制
else //否则 从下标0处开始复制数据
{
UQ4.tail=0; //队列尾移动到0下标处
// 需要增加一个函数 //如果下标0位置处的队列数据还没取出,则表示已满。不再支持接收数据
memcpy(&UQ4.buf[UQ4.tail],buf,len); //未超过数组长度
}
UQ4.n_buf_num[UQ4.n_tail]=len;//帧数据的长度
UQ4.n_buf_addr[UQ4.n_tail]=UQ4.tail;//帧数据的存储地址
UQ4.n_tail=(UQ4.n_tail+1)%UQ4_N_LEN;//防止越界非法访问 更新队列
UQ4.tail+=len;//数据指针
UQ4.n_len++;//计算次数
return TRUE;
}
u8 n_Read_RingBuff(int *len,u8 *buf)
{
unsigned int T_len,T_addr;
if(UQ4.n_len == 0)//判断非空
{
return FLASE;
}
*len =T_len= UQ4.n_buf_num[UQ4.n_head];//先进先出FIFO,从缓冲区头出
T_addr=UQ4.n_buf_addr[UQ4.n_head];
memcpy(buf,&UQ4.buf[T_addr],T_len); //未超过数组长度
UQ4.n_head=(UQ4.n_head+1)%UQ4_N_LEN;//防止越界非法访问
UQ4.n_len--;
return TRUE;
}
本文介绍了一种用于串口通信的数据接收队列设计方法,包括队列初始化、写入和读取操作的具体实现。该设计支持不定长数据包接收,并通过空闲中断进行数据处理。
2052

被折叠的 条评论
为什么被折叠?



