串口中断接收如何判断数组接收完毕呢?

2019-08-18 21:22发布

串口中断接收如何判断数组接收完毕呢?开发板上的例程是是判断最后2个字节是0x0A,0x0D, 而我接收到得数据最后2位就是实际的数值。0x00 ,0x23, 或者0x00 ,0x37 这样不确定的数值,怎么判断数组接收结束了?是最后一个接收到的是'' 吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
19条回答
justin2
2019-08-21 09:56
可以参考下mosbus协议,判断一帧数据完成就是超时3.5个字符,
需要使用的资源 :定时器1个,串口接收中断,一个接收数组unsigned char【】,1个数组索引unsigned char
步骤
1,初始化定时器,计算溢出时间,modbus是3.5个字符间隔9600大概3.5ms,可以根据自己的需求,
2,初始化USART,打开接收中断
3,在USART接收中断中 接收数据保存在接收缓冲区中, ReadBuffer[Index]=USART_ReceiveData(USART1);
然后Inedx++,启动定时器,TIM的Count置0(TIM重新开始)
4,在定时器中断函数中处理信息,当定时器中断时,表示已经3.5个字符的时间没收到数据了,可以认为接收完成了,最后Index索引置0,准备接收下一帧数据。
参考代码
void USART1_IRQHandler()
{
        if(USART_GetITStatus(USART1,USART_IT_RXNE))
        {
                USART_ClearITPendingBit(USART1,USART_IT_RXNE);
                ReadBuffer[Index]=USART_ReceiveData(USART1);
                Index++;
                TIM_SetCounter(TIM2,0);
                TIM_Cmd(TIM2,ENABLE);       
        }

}

void TIM2_IRQHandler()
{
        if(TIM_GetITStatus(TIM2,TIM_IT_Update))
        {
               
                TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
                TIM_Cmd(TIM2,DISABLE);       
                Index=0;       
               处理ReadBuffer接收到的数据
        }
}

一周热门 更多>