RS232(Com-Port)RTS/CTS/DTR/DSR的低级控制可能吗?

Posted

技术标签:

【中文标题】RS232(Com-Port)RTS/CTS/DTR/DSR的低级控制可能吗?【英文标题】:Low-Level control of RS232 (Com-Port) RTS/CTS/DTR/DSR possible? 【发布时间】:2010-10-23 16:16:15 【问题描述】:

我想知道是否以及如何直接从 win32(旧的 C-API)控制 RS-232 握手线。

我想与外部硬件连接,两条简单的数据线就足以满足我的需要。

那么 - 是否有一个用于 win32 的 API 可以让我读取和写入四个状态行的状态?在正常的串行通信中,握手线由 UART 自动驱动(如果启用了硬件握手)。

我记得在 DOS 下它是微不足道的。只需直接对 UART 进行编程。这个功能是否以某种方式在win32中幸存下来?

【问题讨论】:

【参考方案1】:

您可以使用SetCommState() 控制 RTS 和 DTR。您还可以设置硬件或驱动程序处理硬件流控制(CTS 和/或 DSR),或者您可以使用 SetCommMask() 进行设置,以便在这些信号发生变化时获得事件。

这里有一个不错的概述:http://msdn.microsoft.com/en-us/library/ms810467.aspx

请注意,Win32 串行通信 API 和/或驱动程序可能很挑剔,因此请准备好对线路上发生的事情进行一些调试。

【讨论】:

【参考方案2】:

当我不得不做一个项目来与 RS232 端口通信时,我遇到了this 教程。这是一个关于如何打开端口、设置一些属性(包括超时、读/写和关闭端口)的完整示例。尽管您的项目现在可能已经结束,但我希望它仍然有用,因为它仍保留在 SO 档案中。

【讨论】:

您的此链接已失效。你至少记得它的标题吗? 仍然可以通过 WaybackMachine Internet Archive 访问:Serial How-To - RobBayer.comWindows Serial Port Programming - Robertson Bayer (PDF)【参考方案3】:

您仍然可以进行类似类型的编程,以获取您需要实现设备驱动程序的受保护硬件。我认为自从 1980 年代我从事相同类型的工作以来,这已经变得更容易了。

【讨论】:

【参考方案4】:

微软现在真的在做硬件握手吗?多年来NT、win2000和XP在硬件上没有做握手。相反,当 fifo 达到某个点时,设备驱动程序将手动更改 cts 行。这意味着导致设备驱动程序丢失数据非常简单,例如用鼠标抓住一个窗口并在屏幕周围转圈(确保在所有或部分通道上将该窗口从屏幕左侧移开)。 Alt-enter 以全屏显示命令提示符是导致数据丢失的一种简单方法。或者任何其他导致足够中断延迟的东西。基本上,微软的硬件流控制不是硬件而是软件流控制,即使硬件确实具有硬件流控制功能,microsft 的驱动程序也没有设置那个位。 SeaLevel 最终确实支持了这一点,好吧,你必须在 SetCommState() 中放置正确的不相关设置才能启用它。

就控制信号的程序而言,使用 SetCommState()。

【讨论】:

我已经有一段时间没有研究这个东西了,但我的记忆是,PC 世界中的标准问题 8250/16550 UART 不处理片上硬件握手。这不是 Win 驱动程序的问题 - 它只能支持硬件所具有的功能。驱动程序必须在设备中断期间获取状态并切换/检测握手线本身。 SeaLevel 或 Hayes 拥有(或拥有)更多智能硬件,他们的驱动程序会利用这一点。此外,早期的 Windows 驱动程序确实非常非常糟糕,但它们最终或多或少都足够好。【参考方案5】:

有些 USB 转串口适配器不支持 DTR/DSR/DCD 流量控制。 所以可能是你的情况。

http://www.digi.com/support/kbase/kbaseresultdetl?id=588

【讨论】:

以上是关于RS232(Com-Port)RTS/CTS/DTR/DSR的低级控制可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

RS232接口有啥作用呢?

rs232和rs485的区别

RS-232接口

UART,串口,RS232,RS485等等,之间有啥联系和区别?

RS-232, RS-422, RS-485 Serial Communication General Concepts(转载)

RS232