2015-02-09 4 views
0

Как проверить CTS значение линии открытия SerialPort? Идея заключается в том, чтобы установить это значение с устройства с другой стороны, используя трехпроводный последовательный интерфейс без установления связи.Проверка 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 не установлен на напротив того, что было, когда был открыт порт связи. Более того, я вижу MessageBox для значений, которые являются равными тому, что было, когда был открыт COM-порт.. Это действительно странно, потому что я не могу понять значение, используя этот подход.

Другое дело, что WaitCommEventблоки. Я могу закрыть форму и приложение, оканчивающиеся без видимых (пока?) Вопросов, но мне действительно понравилось иметь неблокирующий опрос здесь.

ответ

2

Чтобы получить статус CTS, вам необходимо использовать GetCommModemStatus.

Вы можете использовать WaitCommEvent в неблокирующем режиме с перекрытием IO. То есть, открытие порта как перекрытие и предоставление третьего параметра WaitCommEvent.

+0

Точно функция, которую я искал. Большое спасибо! – Sinatr

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 *означает*. –

+0

Я проверю, работает ли интерфейс, или нет, когда я вручную управляю 'CTS', когда завтра будет' Handshake = none'. Возможно, вы правы, и я вас неправильно понял. – Sinatr

+0

@Sinatr Хорошо, дайте мне знать, из любопытства. Удачи! –

Смежные вопросы