串口接收队列,在空闲中断的基础上添加

本文介绍了一种用于串口通信的数据接收队列设计方法,包括队列初始化、写入和读取操作的具体实现。该设计支持不定长数据包接收,并通过空闲中断进行数据处理。

接收队列 ,空闲中断,数据不定长。

随意编了一个程序,稳定性待测试。

.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;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值