定义循环缓冲buf
#define BUF_LEN 128
#define MSG_LEN 67
typedef struct
{
u8 ucWrIndx;
u8 ucRdIndx;
u16 sWin[BUF_LEN];
}RINGBUF_STRU;
使用C端口进行数据接收
/*c口上升沿,下降沿触发中断*/
EXTI_CR1=0x30;
/*IO中断*/
INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 5)
{
static u8 i=0;
/*取得时间*/
Get_time=TIM1_GetCounter();
/*计数清零*/
TIM1_SetCounter(0);
/*数据送入缓冲*/
stRingBuf.sWin[stRingBuf.ucWrIndx++]=Get_time;
/*索引++*/
stRingBuf.ucWrIndx=(stRingBuf.ucWrIndx%BUF_LEN);
}
/*定时器配置*/
void TIM1_Config(void)
{
//开启定时器1外设时钟
CLK_PCKENR1 |= 0x80;
/*分频 0.01ms记一次数*/
TIM1_PSCRH = 0;
TIM1_PSCRL = 159;
TIM1_CR1 = 0x01; // 计数器使能,开始计数
/*缓冲区初始化*/
stRingBuf.ucWrIndx=0;
stRingBuf.ucRdIndx=0;
}
/*消息判断*/
void IrCheck()
{
u16 usHead1;
u16 usHead2;
u8 ucDataLen;
u8 i;
/*有消息*/
if(stRingBuf.ucRdIndx!=stRingBuf.ucWrIndx)
{
/*长度判定*/
if(stRingBuf.ucWrIndx>=stRingBuf.ucRdIndx)
{
ucDataLen=stRingBuf.ucWrIndx-stRingBuf.ucRdIndx;
}
else
{
ucDataLen=stRingBuf.ucWrIndx+BUF_LEN-stRingBuf.ucRdIndx;
}
/*最小长度*/
if(ucDataLen<MSG_LEN)
{
return;
}
/*head1*/
usHead1=stRingBuf.sWin[stRingBuf.ucRdIndx++];
stRingBuf.ucRdIndx=(stRingBuf.ucRdIndx%BUF_LEN);
if((usHead1>925)||(usHead1<875))
{
return;
}
/*head2*/
usHead2=stRingBuf.sWin[stRingBuf.ucRdIndx++];
stRingBuf.ucRdIndx=(stRingBuf.ucRdIndx%BUF_LEN);
if((usHead2>475)||(usHead2<425))
{
return;
}
/*消息内容*/
for(i=0;i<65;i++)
{
IrDat[i]=stRingBuf.sWin[stRingBuf.ucRdIndx++];
stRingBuf.ucRdIndx=(stRingBuf.ucRdIndx%BUF_LEN);
}
/*消息解析*/
IrAnalysis();
}
}
/*集中解码*/
void IrAnalysis(void)
{
u8 i;
u8 ucFlag;
static u8 ucPp=0;
static u8 ucMode=4;
/*解码地址*/
usAddr=0;
/*解码地址*/
usDat=0;
for(i=0;i<16;i++)
{
/*处理16位数据,*/
if((IrDat[(i<<1)]+IrDat[(i<<1)+1])<56)
{
return;
}
esle if((IrDat[(i<<1)]+IrDat[(i<<1)+1])<168)
{
ucFlag=0;
}
else if if((IrDat[(i<<1)]+IrDat[(i<<1)+1])<275)
{
ucFlag=1;
}
else
{
return;
}
usAddr|=(ucFlag<<(15-i));
}
/*解码数据*/
for(i=0;i<16;i++)
{
if((IrDat[(i<<1)+32]+IrDat[(i<<1)+33])<56)
{
return;
}
else if((IrDat[(i<<1)+32]+IrDat[(i<<1)+33])<168)
{
ucFlag=0;
}
else if((IrDat[(i<<1)+32]+IrDat[(i<<1)+33])<275)
{
ucFlag=1;
}
else
{
return ;
}
usDat|=(ucFlag<<(15-i));
}
}
再配置串口,可以做红外解析工具.