我想检测串口引脚上是否有触发信号,应该是这样的吧:4(DTR)配1(DCD)、6(DSR)、8(CTS)。
可是无论我怎么操作,GetCommModemStatus返回的状态都是0。困扰好多天了,请哪位大虾帮忙分析一下。多谢了!以下是代码://开始监控
private void button1_Click(object sender, EventArgs e)
{
    if (comboBox1.SelectedIndex < 0) return;    try
    {
        comPort = comboBox1.SelectedItem.ToString();        comm_handle = CreateFile(comPort, FileAccess.ReadWrite, FileShare.None, 0, FileMode.Open, FILE_FLAG_OVERLAPPED, IntPtr.Zero);
        if (comm_handle.Equals(INVALID_HANDLE_VALUE)) return;        SpThread = new Thread(SPortThreadExecute);
        SpThread.Start();        AddNewLine("串口 " + comPort + " 打开成功!");        comboBox1.Enabled = false;
        button1.Enabled = false;
        button2.Enabled = true;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}//停止监控
private void button2_Click(object sender, EventArgs e)
{
    try
    {
        if (!comm_handle.Equals(INVALID_HANDLE_VALUE)) CloseHandle(comm_handle);        while ((SpThread != null) && SpThread.IsAlive)
        {
            SpThread.Abort();
            Thread.Sleep(100);
        }        AddNewLine("串口 " + comPort + " 关闭成功!");        comboBox1.Enabled = true;
        button1.Enabled = true;
        button2.Enabled = false;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}//监控线程
private void SPortThreadExecute()
{
    OVERLAPPED m_ov = new OVERLAPPED();
    m_ov.hEvent = CreateEvent(IntPtr.Zero, true, false, null);    if (m_ov.hEvent > 0)
    {
        bool bSuccess = SetCommMask(comm_handle, EV_CTS | EV_DSR | EV_RLSD);
        if (!bSuccess)
        {
            MessageBox.Show("SetCommMask 出错!");
            CloseHandle(m_ov.hEvent);
            return;
        }        while (true)
        {
            uint dwEventMask = 0;
            bSuccess = WaitCommEvent(comm_handle, ref dwEventMask, ref m_ov);
            if (!bSuccess)
            {
                int errorCode = GetLastError();
                if (errorCode != ERROR_IO_PENDING)
                {
                    continue;
                }
            }            //重叠 I/O 操作正在进行中,可以继续做
            uint Event = WaitForSingleObject(m_ov.hEvent, Timeout.Infinite);
            if (Event == WAIT_OBJECT_0)
            {
                uint BytesLen = 0;
                if (!GetOverlappedResult(comm_handle, ref m_ov, ref BytesLen, false))
                    this.Invoke(new ShowString(AddNewLine), new object[] { "GetOverlappedResult return false. " });
                else
                    this.Invoke(new ShowString(AddNewLine), new object[] { "GetOverlappedResult successfully, " + BytesLen.ToString() + " bytes read. " });                uint dwModemStatus = 0;
                if (GetCommModemStatus(comm_handle, ref dwModemStatus))
                {
                    if ((dwModemStatus & MS_CTS_ON) > 0)
                    { this.Invoke(new ShowString(AddNewLine), new object[] { "MS_CTS_ON is be detected" }); }                    if ((dwModemStatus & MS_DSR_ON) > 0)
                    { this.Invoke(new ShowString(AddNewLine), new object[] { "MS_DSR_ON is be detected" }); }                    if ((dwModemStatus & MS_RLSD_ON) > 0)
                    { this.Invoke(new ShowString(AddNewLine), new object[] { "MS_RLSD_ON is be detected" }); }                    this.Invoke(new ShowString(AddNewLine), new object[] { "GetCommModemStatus return true. Status = " + dwModemStatus.ToString() + ", Now time is " + DateTime.Now.ToString() });
                }
                else
                    this.Invoke(new ShowString(AddNewLine), new object[] { "GetCommModemStatus return false. " });
            }            ResetEvent(m_ov.hEvent);        } //end while
    }
}