首页 > 解决方案 > 使用 Windows API 操作 RS 端口

问题描述

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

我知道有

SetCommBreak

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

标签: c++cwindowsserial-portrs485

解决方案


您不能任意无限制地操作 RX 和 TX 引脚*无需编写您自己的 RS485/RS422 协议在芯片上进行硬编码。在加载 Windows 串行驱动程序(自动)时限制操作引脚的原因是串行端口的规范(RS485 / RS 422 是什么)需要特定的数据结构,即起始位、停止位、信号像 RTS(准备发送),...这个必需的数据结构在 windows 串行驱动程序中实现,你不能覆盖它。您可以以生成所需引脚状态的方式自定义数据,但您的数据将始终被封装在串行协议(开始/停止位,...)所需的结构中,请参见https://en.wikipedia.org/wiki/RS-485中的此图 来源: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,则意味着“从站 23,请将您的寄存器值发送给我!

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

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

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

您不能像使用 RS232 上使用的 ASCII 协议那样轻松地“手动”制作 MODBUS 消息:每个 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?论坛=vcgeneral


推荐阅读