我想检测串口引脚上是否有触发信号,应该是这样的吧: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
}
}
可是无论我怎么操作,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
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货