如何查看已打开的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
阻止。我可以关闭表单和应用程序终止而没有可见的(但是?)问题,但我真的很喜欢在这里进行非阻塞轮询。
答案 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个参数。