Большая часть трудностей, связанных с последовательным портом, сосредоточена вокруг предположения. Предполагается, что последовательный порт получает данные в виде удобных кусков и того, что ожидается.
Вот пример. Я знаю, что мой приемник GPS отправляет линии (заканчивается CRLF). Это пример одного из предложений NMEA:
$ GPGSV, 3,1,11,10,75,053,29,29,52,311,32,24,50,298,30,02,39,073,30 * 77
Однако обработчик событий последовательных портов DataReceived может (обычно это происходит на моем ПК) запускаться несколько раз с кусками этих данных.
событие пожара - данные
1 $
2 GPGSV,3,1,11,10
3 ,75,053,29,29,52,311,32,24,50,298,30,02,39,073,30*77
Вместо того чтобы бороться с этим, я создал несколько подпрограмм, которые получают данные всякий раз, когда происходит событие, и ставят его в очередь. Когда мне нужны данные, я вызываю некоторые другие подпрограммы, которые собирают данные обратно в куски размером Я хочу . Таким образом, используя мой пример первый и второй раз, когда я вызываю строку чтения (моя строка чтения), я получаю пустой ответ.
В третий раз я получаю обратно все предложение NMEA.
Плохая новость в том, что я не C #. Код здесь SerialPort
В зависимости от скорости портов делегаты могут быть не лучшим выбором. Я проверил свои подпрограммы на скорости около 1 Мбит / с с использованием делегатов, а не с использованием делегатов. На тех скоростях не использовать делегатов было лучшим выбором.
Вот несколько советов от тех, кто в курсе
Ким Гамильтон