c++ - 使用 Windows API 操作 RS 端口
问题描述
我试图了解如何使用 Windows API 与 RS232/RS422 进行通信。我需要连接一些我无法真正控制通信协议的硬件,所以我不得不使用它。我需要将 TX +(引脚 3)设置为高(~5 伏),将 TX -(引脚 7)设置为低(~0 伏)。
我知道有
SetCommBreak
但这会将两个引脚 (3,7) 置于 ~5 伏。我只需要引脚 3 为 5 伏,引脚 7 为 ~ 0 伏。有没有可行的方法来做到这一点?如果我可以像控制电线一样控制这些线路,我会很高兴,但是有没有办法操纵波特率并传输数据来实现这一点?或者任何一种解决方案?
解决方案
您不能任意无限制地操作 RX 和 TX 引脚*无需编写您自己的 RS485/RS422 协议在芯片上进行硬编码。在加载 Windows 串行驱动程序(自动)时限制操作引脚的原因是串行端口的规范(RS485 / RS 422 是什么)需要特定的数据结构,即起始位、停止位、信号像 RTS(准备发送),...这个必需的数据结构在 windows 串行驱动程序中实现,你不能覆盖它。您可以以生成所需引脚状态的方式自定义数据,但您的数据将始终被封装在串行协议(开始/停止位,...)所需的结构中,请参见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
推荐阅读
- python - 如何在 kv lang 中通过 Kivy 小部件传递方法和 StringProperties
- git - Termux 代码在 Android 手机的 termux 上安装 git
- java - javax.persistence.PersistenceContext.synchronization() 中的错误
- tensorflow - 为什么 vgg16 的 loss 等于 nan,但是在添加额外的 Softmax 层时表现正常?
- python - 使用多个条件重构列表理解
- python - 在 For 循环和 If 语句中附加不正确的值
- c++ - 如何知道模板类中另一个模板类的类型
- webpack - 如何处理 webpack4 中的前端 url-load 问题?
- ios - 安装到主屏幕的 Angular PWA 上的 Gboard 的 iOS 键盘问题
- bash - 如何将输出重定向到 STDERR?