如何获取串行COM端口的状态

时间:2015-12-22 08:09:43

标签: windows delphi serial-port

我的意思是,当我编写项目代码时,我需要与 COM1 COM2 等串口进行通信...但有时候没有设备连接,我也可以使用函数import React, {Component} from 'react'; import Menu from './menu'; export default class App extends Component { render() { return ( <div> <Menu location={this.props.location} /> <div className="jumbotron"> {this.props.children} </div> </div> ); } }; 来获取 COM 端口句柄。

当我使用CreateFile函数将字符串发送到 COM 端口时,软件会阻塞。

在我深入研究这个问题之后,我找到另一个函数WriteFile,它可以获取 COM 端口的状态,但是当我使用 usb-rs232 转换线时,第二个参数始终返回GetCommModemStatus

如何获取 COM 端口状态,以便检查是否有某些设备连接到计算机?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您需要检测设备是否已连接到COM端口并准备接受数据包。如果是这种情况,您需要在发送数据之前检查控制信号(DTR / DSR和CTS / RTS),假设您的设备知道它们并在DB-9或DB-25连接器上设置适当的PIN。有些设备依靠软件握手(XON / XOFF)而不设置控制信号。您最好的选择是查阅设备的文档。

我一直在使用Dejan Crnila的ComPort Library 4.10版。它确实支持硬件和软件握手,因此您可以专注于自己的代码,而不是重新发明轮子

答案 1 :(得分:1)

正如一些人已经指出的那样,尝试“重新发明轮子”并不是一个好主意。除了“快速和脏”测试之外,您的代码必须在单独的线程中处理com端口,并且可用的解决方案都使这更容易。

但是,如果你真的想这样做,我会给你一些指示。

如果您正在使用“WriteFile”,那么您可能已经找到了该过程的“CreateFile”部分以及可以获得的复杂程度取决于您在该过程中指定的IO类型,是否重叠。重叠的IO更复杂,但确实让操作系统承担了一些负担。

您提到您对“WriteFile”的调用挂起。您应该查找“SetCommTimeOuts”函数。将TCommTimeouts的WriteTotalTimeoutMultiplier和WriteTotalTimeoutConstant成员设置为零将告诉操作系统立即返回。如果您的目标使用握手,您可能还需要“SetCommMask”。

接下来发生的事情取决于你的目标应该做什么。 GetCommMask函数可用于检查握手线的状态。