佚名通过本文主要向大家介绍了c#串口编程,串口编程,qt串口编程实例,linux串口编程,c#串口编程实例等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 串口编程中的流控制
描述:
解决方案1:
如果你的单片机 UART 模块支持全双工,那么 DTR/DSR 就不需要。一般来说,PC 端不需要接收时流控制,RTC 也不必使用。这样将剩下了 CTS(表示相当于 Modem 的外设可接收),可用来表示 MCU 忙(注意,信号无效为忙)。此情况下,单片机是 CTS 信号的发送方,它不需要对此信号进行判断。在 PC 端,这个信号需要应用软件去处理。
XON 和 XOFF 都是接收方发送的,因此不存在从数据流中识别控制字的问题。
比如,你的单片机接收 PC 发送的数据,当你需要暂停时,就发送 XOFF;可以重新开始时,再发送 XON。
在 PC 端,XON/XOFF 是用户不可见的。假设你在 PC 端使用 WriteFile() API 发送数据,当驱动层接收到 XOFF 时,如果你使用的是 overlap 方式,WriteFile() 会返回 FAILE。如果你用 GetLastError() 提取错误,将得到 ERROR_IO_PENDING。如果你使用的是非 overlap 方式,程序会在 WriteFile() 处停下来, 等待发送成功(如果未超时)。 解决方案2:
如果你的单片机 UART 模块支持全双工,那么 DTR/DSR 就不需要。一般来说,PC 端不需要接收时流控制,RTC 也不必使用。这样将剩下了 CTS(表示相当于 Modem 的外设可接收),可用来表示 MCU 忙(注意,信号无效为忙)。此情况下,单片机是 CTS 信号的发送方,它不需要对此信号进行判断。在 PC 端,这个信号需要应用软件去处理。
描述:
一般在工业上,为了数据不发生丢失,一般采用硬件流和软件流控制?
硬件流:在DB9的接口上,除了TX,RX,GND,还需要用到:DTR/DSR方式和RTS/CTS方式。在实现时,是不是这两个信号用一般的GPIO来控制?再结合软件来实现?我有一个疑问:我们一般用的串口通信只用了TX,RX,GND一样通信,为什么用这两个多余的信号?我也没看见说只用三个信号线有数据丢失多严重的现象?
软件流怎么用?求大神指教啊
解决方案1:
如果你的单片机 UART 模块支持全双工,那么 DTR/DSR 就不需要。一般来说,PC 端不需要接收时流控制,RTC 也不必使用。这样将剩下了 CTS(表示相当于 Modem 的外设可接收),可用来表示 MCU 忙(注意,信号无效为忙)。此情况下,单片机是 CTS 信号的发送方,它不需要对此信号进行判断。在 PC 端,这个信号需要应用软件去处理。
其中XON采用ASCII字符集中的控制字符DC1(0x11),XOFF采用ASCII字符集中的控制字符DC3(0x13)
软件每接受到一个 字符 必须检查是不是 控制字符DC, 因而 只能 用于 字符(文本)通讯,因为 二进制 通讯 区分不了 DC (0x11,0x13)
XON 和 XOFF 都是接收方发送的,因此不存在从数据流中识别控制字的问题。
比如,你的单片机接收 PC 发送的数据,当你需要暂停时,就发送 XOFF;可以重新开始时,再发送 XON。
在 PC 端,XON/XOFF 是用户不可见的。假设你在 PC 端使用 WriteFile() API 发送数据,当驱动层接收到 XOFF 时,如果你使用的是 overlap 方式,WriteFile() 会返回 FAILE。如果你用 GetLastError() 提取错误,将得到 ERROR_IO_PENDING。如果你使用的是非 overlap 方式,程序会在 WriteFile() 处停下来, 等待发送成功(如果未超时)。 解决方案2:
流控制的目的就是告訴通信的對方什麼時候喂數據,什麼時候自己飽了.
那DB9上的这几个接口DTR/DSR方式和RTS/CTS其实在使用时也是用一般的GPIO来控制,在实际编程中也是if判定?还是说UART控制器自己有一套自己的硬件机制来实现这个协议?
如果你的单片机 UART 模块支持全双工,那么 DTR/DSR 就不需要。一般来说,PC 端不需要接收时流控制,RTC 也不必使用。这样将剩下了 CTS(表示相当于 Modem 的外设可接收),可用来表示 MCU 忙(注意,信号无效为忙)。此情况下,单片机是 CTS 信号的发送方,它不需要对此信号进行判断。在 PC 端,这个信号需要应用软件去处理。