关于串口通信流控控制

       今天硬件提出与CPLD通信时候,需要将通信引脚配置为流控,有点懵逼,马上百度一波。这里简单做个记录。

1 关于流控

       首先,我们需要知道什么“流”,这里“流”是指数据流。当两个硬件设备在通信时候,通信的数据就像流体一样,在两者之间“流动”。
       流,既分方向,也分快慢。在两个设备正常通信时,由于处理速度不同,就存在这样一个问题,有的快,有的慢,在某些情况下,就可能导致丢失数据的情况。如台式机与单片机之间的通讯,接收端数据缓冲区已满,则此时继续发送来的数据就会丢失。
       流控制能解决这个问题,当接收端数据处理不过来时,就发出“不再接收”的信号,发送端就停止发送,直到收到“可以继续发送”的信号再发送数据。因此流控制可以控制数据传输的进程,防止数据的丢失。PC机中常用的两种流控制是硬件流控制(包括RTS/CTS、DTR/CTS等)和软件流控制XON/XOFF(继续/停止)。

2 流控方式

2.1硬件流控

       硬件流控制常用的有RTS/CTS流控制和DTR/DSR(数据终端就绪/数据设置就绪)流控制。
       RTS (Require ToSend,发送请求)为输出信号,用于指示本设备准备好可接收数据,低电平有效,低电平说明本设备可以接收数据。

       CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。

       引用网上的一段介绍:
       硬流控的RTS 、CTS :RTS (Require ToSend,发送请求)为输出信号,用于指示本设备准备好可接收;CTS (Clear ToSend,发送清除)为输入信号,有效时停止发送。假定A、B两设备通信,A设备的RTS 连接B设备的CTS ;A设备的CTS连接B设备的RTS。前一路信号控制B设备的发送,后一路信号控制A设备的发送。对B设备的发送(A设备接收)来说,如果A设备接收缓冲快满的时发出RTS信号(意思通知B设备停止发送),B设备通过CTS 检测到该信号,停止发送;一段时间后A设备接收缓冲有了空余,发出RTS信号,指示B设备开始发送数据。A设备发(B设备接收)类似。

2.2 软件流控

       软件流控和硬件流控都方式一样,只是实现方式不同而已。在通信过程中,软件流控通过在数据流中插入Xoff(特殊字符)和Xon(另一个特殊字符)信号来实现。A设备一旦接收到B设备发送过来的Xoff,立刻停止发送;反之,如接收到B设备发送过来的Xon,则恢复发送数据给B设备。同理,B设备也类似,从而实现收发双方的速度匹配。

3 串口定义

       最后,由于我使用的是DB9串口,因此,我们可以再看看其引脚定义,对以上概念也会更加清晰。
在这里插入图片描述
       由上图,我们可以知道,如果串口只接了RX、TX两个信号,那么要流控的话只能使用软流控;如果接了RX,TX,CTS ,RTS四个信号,那么可以使用硬流控或者软件流控。

### 串口通信中的实现与配置 #### RS232硬件 RS232标准下的硬件主要依赖于RTS(Request To Send)和CTS(Clear To Send)信号线来协调发送方和接收方之间的数据动。当接收设备准备好接受新数据时,会通过激活其CTS信号通知发送设备;同样地,发送设备会在准备发送前激活其RTS信号以询问接收端的状态[^1]。 对于现代嵌入式开发环境而言,例如基于ARM架构的微控制器平台,由于这些处理器通常提供的是TTL级别的UART接口而非直接支持完整的RS232电压范围,因此需要借助外部电路完成电平转换工作以便兼容传统的PC机或其他工业设备上的RS232端口需求[^2]。 然而值得注意的是,在当前计算机体系下原生具备物理RS232接口的情况已经非常少见,更多时候我们会采用USB转串技术方案作为替代选项之一继续维持此类应用场合所需的功能特性不变的同时简化连线复杂度并提升便携性。 #### STM32硬件 (针对RS232 & RS485) 在STM32系列MCU中实施串行通讯过程里的硬体层次量管理策略有两种典型应用场景: 1. **RS232风格的传统型双向全双工模式** 此种情形下涉及到具体的引脚分配以及相应的寄存器位设定操作,目的是为了启用内置逻辑单元从而自动处理来自远端节点所发出的手势命令序列进而达成动态调整缓冲区容量的目的。具体来说就是在初始化阶段指定好哪些GPIO应该承担起RTS/CTS角色之后再开启对应中断源等待事件触发时刻到来执行相应动作程[^3][^4]. 2. **RS485半双工方向切换控制** 对于那些仅需单向交替工作的总线拓扑结构,则可通过额外增加一片专用驱动IC配合MCU内部定时器资源共同协作完成整个周期内的读写权限交接管理工作。这里特别强调一点就是必须正确连接DE管教至目标器件才能确保正常运转效果达到预期目标值范围内. 以下是有关如何设置STM32 HAL库项目文件夹下面usart.c部分代码片段展示: ```c // 启用硬件握手功能 huart.Instance->CR3 |= USART_CR3_RTSE; // 设置RTS使能位 huart.Instance->CR3 &= ~USART_CR3_CTSE;// 清除CTS使能位 如果不需要的话 ``` 以上例子展示了怎样单独打开RTS输出指示灯泡而关闭掉另一个输入检测机制的情形假设条件成立的前提下进行演示说明而已实际运用当中可能还需要考虑更多的参数细节方面的东西比如波特率数值大小等等因素综合考量过后才能够得出最终结论版本号信息等内容均省略未提及之处敬请谅解! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值