2015-02-09 54 views
0

如何檢查開SerialPortCTS行的值?想法是在不使用握手的情況下使用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。我可以關閉表單並終止應用程序,但沒有可見(但?)問題,但我真的很喜歡在這裏進行非阻塞輪詢。

回答

2

您需要使用GetCommModemStatus檢索CTS的狀態。

可以在非阻塞模式重疊的IO使用WaitCommEvent。也就是說,打開端口重疊並提供WaitCommEvent的第三個參數。

+0

正在尋找的功能正確。非常感謝! – Sinatr 2015-02-09 16:35:36

3

3線串行接口不包含CTS信號,因此您不能使用它。

至於閱讀CTS的價值,文檔在這裏:https://msdn.microsoft.com/en-us/library/windows/desktop/aa363194%28v=vs.85%29.aspx你想看看GetCommMask()GetCommModemStatus()

+0

來自[wikipedia](http://en.wikipedia.org/wiki/RS-232#3-wire_and_5-wire_RS-232)*「一個最小的」3線「RS-232連接只包含發送數據,接收數據和接地,通常在不需要RS-232的全部設備時使用。*「 - 我很抱歉,但是在這裏,stackoverflow的文化是回答什麼OP *問*,而不是什麼OP *手段*。 – 2015-02-09 16:36:31

+0

明天當我手動控制'CTS'而'Handshake = none'時,我會檢查接口是否工作。也許你是對的,我誤解了你。 – Sinatr 2015-02-09 16:37:11

+0

@Sinatr好吧,出於好奇,讓我知道。祝你好運! – 2015-02-09 16:38:09