前一节我们讲述了一种通过串口来构建一个类printf格式化打印,并且可以设定log输出等级和log名称的方法。这一节我们类讲述uart串口数据的接收。
串口数据接收在嵌入式开发中应用非常广泛,但是要想串口能够稳定的进行数据接收还是有些地方要注意的,不然就会出现串口丢字节,丢数据的现象,效率低的问题。
串口数据接收方法一:按字节逐一接收。
这种方式通常是最基本的方式,一个字节串口数据过来,触发一次串口中断,在串口中断中可以读到一个字节数据,然后依次放入串口接收buff中,等接收到结束符或达到提前约定的数据长度时,可以认为本次接收结束,可以进行下一步处理数据的动作。
优点:配置简单 操作方便
缺点:中断频繁,效率低下,需要提前约定好接收结束符,如接收的是字符数据,通常用\r\n来判断结束。字节数据通常用约定好的如0x050d作为结束标志。
或者是通过接收数据的长度,比如达到64字节就认为一帧结束。
串口数据接收方法二:DMA+空闲中断方式实现“整包”不定长串口数据接收。
优点:配置适中,需要串口空闲中断配合DMA一起使用。效率高,适合大块数据不定长接收。开始数据接收时DMA开始接收,等接收结束,串口线回到空闲状态,产生空闲中断,认为这一波数据接收结束,将本次DMA中获取的数据存入FIFO。
具体怎样配置DMA+空闲中断方式网上已有很多相关的博文,请自行查找。
缺点:存在某些类型的芯片空闲中断触发不及时造成结束判断错误而造成丢字节的情况。
串口数据接收方法三:DMA+空闲timer方式实现“整包”不定长串口数据接收。
针对方法二中空闲中断有不准确的情况,可以使用方法三来弥补。这种方法是做一个timer定时器,串口开始接收数据时开启定时,只要有连续的数据过来就reset 定时器重新定时,当最后一个数据接收结束时,定时器定时中断产生,认为本波数据接收完毕,在中断处理函数中将DMA中数据存入FIFO。具体的定时器超时时间可根据实际情况设定,比如5ms/10ms 等。