Часть программы, которую я модифицирую, включает в себя передачу через последовательный порт с использованием запатентованной библиотеки. К сожалению, эта библиотека не имеет того же SerialPort.DataReceived event, что и пространство имен System.IO.Ports. На самом деле, он не имеет никаких событий вообще, однако у него есть две функции, которые, вероятно, могут быть использованы аналогичным образом:Поднять событие при возврате функции True
Port.WaitForData (интермедиат время)
Эта функция ждет определенное количество времени, чтобы получать некоторые ранее указанные строки над портом. Он возвращает 1 для да, полученная строка, или 0 для нет, не получил строку, тайм-аут.
Port.IsReceiveBufferEmpty()
Эта функция возвращает логическое значение из да, приемный буфер пуст или нет, приемный буфер содержит данные.
Мне кажется, я должен создать некоторую нить непрерывно зацикливание при открытии порта и сделать одну из этих двух вещей:
Для каждого цикла, называют WaitForData (некоторые большое количество) с указанными строками, которые он ищет для «», или vbCrLf, или что-то еще, что я могу подтвердить, будет получать каждый раз, когда отправляются данные. Если он находит что-то, прочитайте его и напишите в текстовое поле. Если WaitForData ничего не найдет, повторите цикл.
Для каждого цикла вызовите IsReceiveBufferEmpty(), а если нет, прочитайте его и напишите в текстовое поле.
Какой лучший способ реализовать это? Первые варианты кажутся потенциально более эффективными для меня, хотя я почти ничего не знаю о том, как этот метод работает под капотом. Очевидно, что я хочу, чтобы моя форма реагировала на это, так как я должен продолжать непрерывный цикл, не замораживая форму, но имея возможность читать любые входящие данные?
Благодарим за помощь.
Написание такого API для общего использования будет отличаться от его оптимизации для любого приложения, которое вы пишете. мы ничего не знаем о вашем приложении. одна вещь: «... писать в текстовое поле ...», вы будете иметь возможность сделать это из любого рода потокового решения. Я бы поднял событие и предоставил полученные данные, и пусть потребитель справится с ним. – Plutonix
@Plutonix Я не совсем уверен, как имитировать событие DataReceived в моем коде, и я пытаюсь найти лучший способ сделать это. Приложение принимает входные данные из текстового поля, отправляет его на порт, а затем считывает что-либо обратно из порта. Есть ли больше информации, которая вам нужна, чтобы в целом описать, как можно было бы это сделать? Могут ли мои решения выше иметь смысл? Кроме того, в многопоточных приложениях я могу использовать Invoke или что-то похожее на запись в компоненты формы, правильно? – Django
Можете ли вы использовать 'Async/Await' (VS 2012+/.NET 4.5+ - или 4.0 с некоторыми дополнительными библиотеками)? – Mark