SerialPort检查CTS

时间:2015-02-09 16:13:39

标签: c# winapi serial-port interop

如何查看已打开的CTS的{​​{1}}行值?想法是在没有握手的情况下使用3线串行接口从另一侧的设备设置该值。

以下是一些开始讨论的代码(改编为msdn示例):

SerialPort

此代码可以告诉我[DllImport("kernel32.dll")] static extern bool SetCommMask(IntPtr hFile, uint dwEvtMask); [DllImport("kernel32.dll")] static extern bool WaitCommEvent(IntPtr hFile, out uint lpEvtMask, IntPtr lpOverlapped); SerialPort _port = null; bool _exit; public Form1() { InitializeComponent(); _port = new SerialPort("COM2"); _port.Open(); // getting handle is tricky var handle = ((SafeFileHandle)_port.BaseStream.GetType().GetField("_handle", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(_port.BaseStream)).DangerousGetHandle(); // set mask to listen to change of CTS signal if (!SetCommMask(handle, 0x0008)) // EV_CTS throw ... // start listener Task.Run(() => { while (!_exit) { uint mask = 0; if (WaitCommEvent(handle, out mask, IntPtr.Zero)) if ((mask & 0x0008) != 0) Task.Run(() => MessageBox.Show("smth happenz")); }); _port.Close(); } } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { _exit = true; } 行上是否存在更改信号,但无法弄清楚如何获得实际的(是它高还是低?)。

除此之外还有一些奇怪的问题。 CTS会立即(WaitCommEvent)返回false,除非Marshal.GetLastError() = 0设置为与打开com-port时相反的。此外,我看到CTS的值等于打开com-port时的值。这真的很奇怪,因为我无法通过这种方法找出一个值。

另一件事是MessageBox 阻止。我可以关闭表单和应用程序终止而没有可见的(但是?)问题,但我真的很喜欢在这里进行非阻塞轮询。

2 个答案:

答案 0 :(得分:3)

3线串行接口不包含CTS信号,因此您无法使用它。

至于阅读CTS的价值,文档在此处:https://msdn.microsoft.com/en-us/library/windows/desktop/aa363194%28v=vs.85%29.aspx您要查看GetCommMask()GetCommModemStatus()

答案 1 :(得分:2)

您需要使用GetCommModemStatus来检索CTS的状态。

您可以在非阻塞模式下使用WaitCommEvent并重叠IO。也就是说,将端口打开为重叠并提供WaitCommEvent的第3个参数。