STM32的串口硬件流控(RS232/RS485)

流控的概念源于 RS232 这个标准,在 RS232 标准里面包含了串口、流控的定义。RS232 中的“RS”是Recommend Standard 的缩写,即”推荐标准“之意,它并不像 IEEE-1284、IEEE-1394 等标准,是由“委员会定制”。因而,不同的厂商在做 RS232 时,多少会有不同,流控也都会存在差异。

1.为什么需要流控

当两台设备进行串口通信,假如他们对数据的处理速度不同。如果接收端数据缓冲区已满,则此时继续发送来的数据就会丢失。使用流控机制时,当接收端数据处理能力饱和时,就发出“不再接收”的信号,发送端就停止发送,直到接收端处理能力释放,发送“可以继续发送”的信号给发送端时,发送端才继续发送数据。

2.硬件流控

硬件流控一般通过CTS(Clear to Send)和RTS(Request To Send)两个引脚来实现,如下图:

88fe535f8f40299394ffd67f1425eaa0.png

A如果想要发送数据给B的话,A会使得RTS(Request To Send)引脚有效,表明其想要“请求发送”数据给作为接收设备的B,而A接着就会去检测对应的来自B的CTS引脚,直到CTS有效,才会真正开始发送数据。并且,接下来,在发送每个字符之前,都会去检测对应的CTS是否有效,如果有效,才会继续传输对应的数据,如果发现CTS无效,那么就不能发生数据了。

对于上述CTS一直有效的情况下,A就一直发送数据给B,到了最后数据发送完之后,再把RTS设置为无效,表示数据已经发送完了。

这就是整个单个的数据发送流程。

3.软件流控

软件流控是以特殊的字符来代表从机已经不能再接收新的数据了,基本的流程就是从机在接收数据很多的时候或主动给发送端发送一个特殊字符,当发送端接收到这个特殊字符后就不能再发送数据了。

软件流控很容易实现,因此硬件流控使用已经很少了,了解即可,不必深入研究。

4.STM32的硬件流控

部分型号的STM32的USART具有硬件流控的功能,可以实现RS232的硬件流控。还有部分型号的STM32具有RS485的硬件流控功能。因为RS232的硬件流控的硬件流控用的很少,这里主要介绍一下RS485的硬件流控。

我们知道RS485是半双工通信,需要有一个单片机引脚来控制485芯片的数据方向(发送或接收),当然也可以通过硬件来实现自动收发的切换,参考《一种RS485自动收发电路》。

通过软件来控制485芯片的收发时,每次发送数据前,需要将引脚置高,发送完成后再置低:

SET_DE1; //DE引脚置高
HAL_UART_Transmit(&huart1,Uart1.TxBuf,Uart1.TxNum,1000);//发送数据
CLR_DE1; //DE引脚置低

如果采用中断发送的方式,还需要打开发送完成中断,发送之前引脚置高,在发送完成中断中将引脚置低。

SET_DE1; //DE引脚置高
HAL_UART_Transmit_IT(&huart1,Uart1.TxBuf,Uart1.TxNum);//发送数据
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)//发送完成中断
{
  if(huart->Instance == USART1)
  {
    CLR_DE1;
  }
}

如果采用RS485硬件流控的方式,需要在初始化时使能RS485硬件流控功能:

c48dc529e2604ca652a859fe6f075b4c.png

这样就不必通过软件来控制引脚的高低电平了(发送时单片机会自动控制),不管是中断或非中断发送数据,直接发送数据就行,非常方便。

推荐阅读:

STM32CubeMX系列教程

PCB线宽与通流量

STM32的硬件I2C有BUG吗?

步进电机S型曲线加速的实现

     欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>