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

2019-08-18 21:22发布

串口中断接收如何判断数组接收完毕呢?开发板上的例程是是判断最后2个字节是0x0A,0x0D, 而我接收到得数据最后2位就是实际的数值。0x00 ,0x23, 或者0x00 ,0x37 这样不确定的数值,怎么判断数组接收结束了?是最后一个接收到的是'' 吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
密耳
1楼-- · 2019-08-20 19:33
用判断吗??.........
密耳
2楼-- · 2019-08-20 23:01
定义两个变量,如RXF,TXF;接收时RXF++,数据处理时TXF++;当RXF==TXF,就没数据要处理了......这就是环形队列处理的精髓。
再不会写,就看它,https://item.taobao.com/item.htm ... amp;id=537439006677
xujian468
3楼-- · 2019-08-21 00:49
好像原子的蓝牙模块程序里用到了超时法吧,记不清了
wdxYHC
4楼-- · 2019-08-21 05:17
 精彩回答 2  元偷偷看……
justin2
5楼-- · 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接收到的数据
        }
}
xuyan021
6楼-- · 2019-08-21 13:50
,很详细!

一周热门 更多>