如何检查打开的CTS
行值SerialPort
?其思想是在使用三线串行接口而不握手的情况下,从另一边的设备中设置这个值。
下面是一些开始讨论的代码(改编后的msdn )
[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;
}
这段代码可以告诉我,在线路上是否有信号的,但是无法知道如何获得实际的值(是高还是低?)
除此之外,还有一些奇怪的问题。WaitCommEvent
立即返回false
(与Marshal.GetLastError() = 0
一起),除非CTS
设置为与com-端口打开时相反的位置。此外,我看到MessageBox
的值等于com-端口打开时的值。这真的很奇怪,因为我无法用这种方法计算出一个值。
另一件事是WaitCommEvent
阻止的东西。我可以关闭表单和应用程序终止,而不是可见的(还?)有问题,但我真的很喜欢这里的非阻塞投票。
发布于 2015-02-09 16:28:55
您需要使用GetCommModemStatus
检索CTS的状态。
您可以在非阻塞模式下使用WaitCommEvent
和重叠IO。也就是说,以重叠的方式打开端口,并提供WaitCommEvent
的第三个参数。
发布于 2015-02-09 16:20:41
三线串行接口不包括CTS信号,所以您不能使用它.
至于读取CTS的值,文档如下:https://msdn.microsoft.com/en-us/library/windows/desktop/aa363194%28v=vs.85%29.aspx --您想要查看GetCommMask()
和GetCommModemStatus()
。
https://stackoverflow.com/questions/28414178
复制相似问题