我的意思是,当我编写项目代码时,我需要与 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 端口状态,以便检查是否有某些设备连接到计算机?
答案 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函数可用于检查握手线的状态。