我的意思是,当我编写一个项目时,我需要像串口COM1 , COM2 …,但有时没有连接设备,我也可以使用函数CreateFile
获取COM端口句柄。
当我使用WriteFile
函数向COM端口发送一个string的软件块。
在深入研究这个问题之后,我发现另外一个函数GetCommModemStatus
可以获得COM端口的状态,但是当我使用usb-rs232转换线时,第二个参数总是返回0
。
我怎样才能得到COM端口的状态,以便我可以检查是否有一些设备连接到电脑?
如果我理解正确,你想检测一个设备是否连接到你的COM端口,并准备好接受数据包。 如果是这种情况,您需要在发送数据前检查控制信号(DTR / DSR和CTS / RTS),假设您的设备知道这些信号并在您的DB-9或DB-25连接器上设置适当的PIN。 有些设备依赖于软件握手(XON / XOFF),而不是设置控制信号。 你最好的选择是咨询你的设备的文档。
我一直在使用Dejan Crnila的ComPort Library 4.10版。 它支持硬件和软件握手,所以你可以专注于自己的代码,而不是重新发明轮子 。
正如几个人已经指出的那样,试图“重新发明轮子”并不是一个好主意。 除了“快速和肮脏的”测试,你的代码将不得不在一个单独的线程处理COM端口,可用的解决方案,使这更容易。
但是,如果你真的想这样做,我会给你一些指示。
如果你正在使用“WriteFile”,那么你可能已经想出了程序中的“CreateFile”部分,以及复杂的东西可以取决于你在那个过程中指定了什么样的IO,重叠与否。 重叠的IO更复杂,但确实让操作系统处理了一些负担。
你提到你对“WriteFile”的调用是挂起的。 你应该查看“SetCommTimeOuts”函数。 将TCommTimeouts的WriteTotalTimeoutMultiplier和WriteTotalTimeoutConstant成员设置为零将告诉操作系统立即返回。 如果您的目标使用握手,您可能还需要“SetCommMask”。
接下来发生的事情取决于你的目标应该做什么。 GetCommMask函数可以用来检查握手线的状态。