使用 Windows API 操作 RS 端口

Posted

技术标签:

【中文标题】使用 Windows API 操作 RS 端口【英文标题】:Manipulating RS ports with the Windows API 【发布时间】:2018-08-14 12:44:32 【问题描述】:

我正在尝试了解如何使用 Windows API 与 RS232/RS422 进行通信。 我需要连接一些我无法真正控制通信协议的硬件,所以我不得不使用它。 我需要将 TX +(引脚 3)设置为高电平(~5 伏),将 TX -(引脚 7)设置为低电平(~0 伏)。

我知道有

SetCommBreak

但这会将两个引脚 (3,7) 置于 ~5 伏。我只需要引脚 3 为 5 伏,引脚 7 为 ~ 0 伏。有没有可行的方法来做到这一点?如果我可以像控制电线一样控制这些线路,我会很高兴,但是有没有办法操纵波特率并传输数据来实现这一点?还是有什么解决办法?

【问题讨论】:

不是同一个问题..反转..我发现两个信号都很高,当它说它不应该是 @joe 在另一个问题中,您说调用SetCommBreak(handle) 可以完成您所说的您在这里尝试做的事情。 RS232 甚至没有 TX+ 和 TX- 引脚。这里的问题是您使用的是 RS422,但 Windows 提供了一个端口的抽象。在那个抽象中,你发送比特。您不会将端口置于高或低状态。对于这类东西,您可以使用带有 GPIO 引脚的 Raspberry Pi,这些实际上是通用的。 【参考方案1】:

您不能无限制地任意操作 RX 和 TX 引脚 *如果您自己的 RS485/RS422 协议是在芯片上硬编码编写的。在加载 Windows 串行驱动程序(自动)时限制操作引脚的原因是串行端口的规范(RS485 / RS 422 是什么)需要特定的数据结构,即起始位、停止位位,RTS(准备发送)等信号,...这个必需的数据结构在 Windows 串行驱动程序中实现,您不能覆盖它。您可以通过生成所需引脚状态的方式自定义数据,但您的数据将始终封装在串行协议所需的结构中(开始/停止位,...), cf这张图来自https://en.wikipedia.org/wiki/RS-485

在 Windows 中,您以 DCB 结构 (https://docs.microsoft.com/en-us/windows/desktop/api/winbase/ns-winbase-_dcb) 初始化串行端口

在此串行端口结构中,定义了在 RS485 / RS422 上运行的几种协议,如 MODBus,...

您可以将 RS-485/RS-422 串行端口视为“智能文件”。 'smart' 因为可以访问多个从站/地址。如果您将正确的地址写入文件/串行总线,您会得到答案,即如果您写入 23,则意味着“Slave 23,请将您的寄存器值发送给我!

这个覆盖协议是必须在软件中实现的。为此,您不需要操作单个引脚,可能除了 RTS 之类的控制线,...实际上,如果不编写自己的驱动程序,您将无法做到这一点。

如何实现MODBus协议的示例在http://libmodbus.org/documentation/

以下引用表明运行在 RS-485 上的协议是在串行端口层上编写的:

您不能像以前那样轻松地“手工”制作 MODBUS 消息 使用 RS232 上使用的 ASCII 协议完成:每个 MODBUS 消息以 校验和代码,根据消息的全部内容计算得出。到 交换 MODBUS 消息,因此您必须使用:

设备供应商提供的特定程序,具有兼容的接口;

或一个简单的 RS485 接口,带有一个编码的编程库 并解码 MODBUS 消息;

或智能 RS485 接口能够 自行编码和解码 MODBUS 消息,例如 Yocto-RS485。

来源:http://www.yoctopuce.com/EN/article/a-quick-tutorial-on-rs485-and-modbus

https://social.msdn.microsoft.com/Forums/vstudio/en-US/1751dafb-2fd5-48b8-8c16-08dd95d7db6d/writing-a-string-to-an-rs485-port-vs-2010-c?forum=vcgeneral

【讨论】:

以上是关于使用 Windows API 操作 RS 端口的主要内容,如果未能解决你的问题,请参考以下文章

WINDOWS 上的 WebSerial API - “DOMException:无法打开串行端口。”

使用java代码关闭指定端口的程序-windows下

Windows 是不是有任何积极支持的 lcov 端口

我可以在ios sdk中使用wi-fi direct api吗?

C++ 中的串行端口 (RS -232) 连接

Windows ping TCP端口工具之tcping