实时响应串口的接收与发送:不需要询问串口缓冲区是否有数据

目录

  • 优秀的代码,糟糕的调用

优秀的代码,糟糕的调用

代码阻塞是单片机程序编写过程中一个比较讨厌的问题,为了避免阻塞的出现,工程师们常常花很大的力气设计非阻塞的函数和代码结构。然而用不好,同样没效果(捂脸)。

//以下的函数是已经做了硬件隔离的函数,如果您的函数没有做硬件隔离,请不要套用。

串口是常用的通信手段,在大量收发的应用中,或者多任务的应用中,非阻塞串口代码的重要性就非常重要了。现在有和硬件隔离的如下的函数:

USART_GetChar,USART_PutChar,USART_GetCharsInRxBuf,USART_IsTxEmpty,分别用于读取,发送,查询接收缓存中的数据数目,发送缓存是否为空,此处缓存是自己划出来的,和硬件的Buffer无关。由于做了硬件隔离,USART_GetChar,USART_PutChar都是非阻塞的,现有如下代码:

// 满洲里国峰电子科技	www.guofengdianzi.com
// 微信:GuofengDianZi
if(USART_GetCharsInRxBuf()!=0)
{
	USART_GetChar(&RxData);
}
if(USART_IsTxEmpty()!=0)
{
	USART_PutChar(TxData);
}

两个if语句,看似很相似,但其实第一个if语句合理的使用了非阻塞的函数,第二个则浪费了非阻塞的特性。读取先查缓冲内部数据的数量,有数据,则读取,无数据跳过–合理。发送时不需要知道发送缓存中是否有数据,直接调用即可,因为编写的底层函数可以会逐个发送压入的数据,这正是非阻塞代码的意义。

若加上if(USART_IsTxEmpty()!=0),若此时有数据就不会发送TxData了,则恰恰丧失了实时性。对于已经做了硬件隔离层的函数,应该充分发挥其特性,这里的PutChar可直接调用,不应询问。

作者:伏熊(专业:射频芯片设计、雷达系统。爱好:嵌入式。欢迎大家项目合作交流。)
微信:GuoFengDianZi

你可能感兴趣的:(嵌入式软硬件设计)