Winapi RS232(Com端口)RTS/CTS/DTR/DSR的低电平控制是否可行?

Winapi RS232(Com端口)RTS/CTS/DTR/DSR的低电平控制是否可行?,winapi,embedded,serial-port,handshaking,Winapi,Embedded,Serial Port,Handshaking,我想知道是否以及如何能够直接从win32(旧的C-API)控制RS-232握手线路 我想与一个外部硬件接口,两条简单的数据线就足以满足我的需要 那么-有没有win32 API可以让我读取和写入四个状态行的状态?在正常串行通信中,握手线路由UART自动驱动(如果启用了硬件握手) 我记得在DOS下它是微不足道的。只需直接对UART进行编程即可。这个功能在win32中以某种方式幸存下来了吗 您仍然可以执行类似类型的编程,但仅限于实现设备驱动程序所需的受保护硬件。我想,自从20世纪80年代我做同样类型的

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

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

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


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

您仍然可以执行类似类型的编程,但仅限于实现设备驱动程序所需的受保护硬件。我想,自从20世纪80年代我做同样类型的工作以来,这已经变得容易了。

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

这里有一个不错的概述:


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

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


至于控制信号的程序,请使用SetCommState()。

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

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


我已经有一段时间没有研究过这个东西了,但我的记忆是,8250/16550 UART是PC世界的标准问题,它不处理芯片上的硬件握手。这不是Win驱动程序的问题-它只能支持硬件所具有的功能。驱动程序必须在设备中断期间获取状态,并切换/感知握手线路本身。SeaLevel或Hayes拥有(或拥有)更多智能硬件,他们的司机将利用这些硬件。另外,早期的Windows驱动程序确实非常非常糟糕,但它们最终或多或少都足够好。你的这个链接已经失效了。您至少记得它的标题吗?仍然可以通过WaybackMachine Internet Archive访问: