如何檢查開SerialPort
CTS
行的值?想法是在不使用握手的情況下使用3線串行接口時,從另一端的設備設置此值。的SerialPort檢查CTS
下面是一些代碼開始討論(改編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
線變化,但無法弄清楚如何得到實際的值(是高還是低?)。
除此之外,還有一些奇怪的問題。 WaitCommEvent
回報false
立即(同Marshal.GetLastError() = 0
),除非CTS
設置爲相反到什麼時候COM端口被打開它。此外,我看到MessageBox
的值是等於com-port打開時的值。這真的很奇怪,因爲我不能通過使用這種方法找出價值。
另一件事是WaitCommEvent
塊。我可以關閉表單並終止應用程序,但沒有可見(但?)問題,但我真的很喜歡在這裏進行非阻塞輪詢。
正在尋找的功能正確。非常感謝! – Sinatr 2015-02-09 16:35:36