在程序中使用环形队列判断接收数据格式,避免在中断中处理造成程序响应速度慢的问题。
直接贴代码:
LoopRxCommu.h
#ifndef __LOOPRXCOMMU_H
#define __LOOPRXCOMMU_H
#include "hal_types.h"
typedef struct{
volatile u16 out;//环形队列头
volatile u16 in;//环形队列尾(输入数据位置)
volatile u8 *rbuf;//环形队列指针
volatile u16 rxlen;//环形队列长度
volatile u16 rxmsglen;//一帧消息长度
}tLoopDev;
int Loop_RxBufLen(tLoopDev *appuart);
u8 Loop_RxBufGet(tLoopDev *appuart,u16 uPos);
void Loop_RxBufPut(tLoopDev *appuart,u8 *pbuf, u16 len);
void Loop_RxFlush(tLoopDev *appuart);
void Loop_RxBufDel(tLoopDev *appuart,u16 uLen);
void Loop_RcvOneByte(tLoopDev *appuart,u8 byte);
#endif
LoopRxCommu.c
#include "LoopRxCommu.h"
#include "ucos_ii.h"
#include <string.h>
/**************************************************************************
说明: 读环形BUF数据长度
**************************************************************************/
int Loop_RxBufLen(tLoopDev *appuart)
{
register int length=0;
length = appuart->in - appuart->out;
if (length < 0)
length += (appuart->rxlen);
return length;
}
/**************************************************************************
说明: 读取到的字符
**************************************************************************/
u8 Loop_RxBufGet(tLoopDev *appuart,u16 uPos)
{
return appuart->rbuf[((appuart->out + uPos) % (appuart->rxlen))];
}
/**************************************************************************
说明: 存入收到的字符
**************************************************************************/
void Loop_RxBufPut(tLoopDev *appuart,u8 *pbuf, u16 len)
{
u16 i;
for(i=0; i<len; i++)
{
appuart->rbuf[appuart->in] = pbuf[i];
appuart->in++;
if(appuart->in>=(appuart->rxlen))
appuart->in=0;
}
}
/**************************************************************************
说明: 清空数据
**************************************************************************/
void Loop_RxFlush(tLoopDev *appuart)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
OS_ENTER_CRITICAL();
appuart->in = 0;
appuart->out = 0;
//memset(appuart->rbuf,0xff,(appuart->rxlen));
OS_EXIT_CRITICAL();
}
/**************************************************************************
说明: 删除接收缓冲区制定长度的字符
**************************************************************************/
void Loop_RxBufDel(tLoopDev *appuart,u16 uLen)
{
uint16_t uRecvLen = Loop_RxBufLen(appuart);
if (uLen <= uRecvLen)
{
appuart->out = (appuart->out + uLen) % (appuart->rxlen);
}
else
Loop_RxFlush(appuart);
}
void Loop_RcvOneByte(tLoopDev *appuart,u8 byte)
{
appuart->rbuf[appuart->in]=byte;
appuart->in++;
if(appuart->in>=(appuart->rxlen))
appuart->in=0;
}
|