串口检查CTS

SerialPort check CTS

如何查看打开的SerialPortCTS行值?想法是在使用不握手的 3 线串行接口时从另一侧的设备设置此值。

这里是开始讨论的一些代码(改编自 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;
}

此代码可以告诉我 CTS 线上是否有 信号变化 ,但无法弄清楚如何获得实际 value (高还是低?).

除此之外还有一些奇怪的问题。 WaitCommEvent returns false 立即(使用 Marshal.GetLastError() = 0)除非 CTS 设置为 与打开 com 端口时的设置相反。此外,我看到 MessageBox 的值 等于打开 com 端口时的值 。这真的很奇怪,因为我无法使用这种方法计算出一个值。

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

3线串口不包含CTS信号,不能使用

关于读取CTS的值,文档在这里:https://msdn.microsoft.com/en-us/library/windows/desktop/aa363194%28v=vs.85%29.aspx你要看GetCommMask()GetCommModemStatus()

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

您可以在非阻塞模式下使用重叠 IO WaitCommEvent。也就是说,打开重叠的端口并提供 WaitCommEvent.

的第 3 个参数