Как проверить 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
блоки. Я могу закрыть форму и приложение, оканчивающиеся без видимых (пока?) Вопросов, но мне действительно понравилось иметь неблокирующий опрос здесь.
Точно функция, которую я искал. Большое спасибо! – Sinatr