Рейтинг:
4
Jochen Arndt
Вы обрабатываете получение в асинхронном событии. Это срабатывает, когда появляются новые данные. В вашем случае port.BytesToRead
это одно с первым событием. Как только событие было обработано (один байт считан), оно возвращается. Тем временем были получены дополнительные байты, и событие было вызвано снова.
Возможным решением является использование глобального буфера класса и переменной индекса буфера для добавления данных. Как только количество ожидаемых байтов данных получено (фиксированное значение, как кажется в вашем случае, длина является частью данных, или есть конечный индикатор, такой как новая строка с текстовыми данными), обработайте данные (установите текст) и сбросьте переменную индекса.
alidayan
Когда я добавляю порт.Напишите, что моя проблема решена. Это касается протокола modbus я думаю что устройство ждало ответа
OriginalGriff
Не имеет значения - то, что говорит Йохен, верно: именно так работают последовательные данные. Как только данные будут доступны, вы получите событие - и порт не "знает" о протоколе, он просто получает байты, когда они приходят один за другим. Если ваше удаленное устройство отправляет сообщение длиной более одного символа, вы почти наверняка получите несколько запускаемых событий, и вы обнаружите, что таинственным образом "теряете данные", потому что более поздние отдельные символы перезаписывают предыдущие. Конечно, если ваш компьютер не очень медленный или загруженный - 9600 бод позволяет передавать максимум около 1000 символов в секунду!
Jochen Arndt
В дополнение к тому, что сказал Грифф:
Вставка записи не решит проблему. Хотя он может работать в вашей системе, он может не работать в других системах.
OriginalGriff
Получает свою пятерку.
Jochen Arndt
Спасибо Вам за пятерку и особенно за ваш комментарий.