alidayan Ответов: 1

Последовательный порт получает данные как 2 часть


Всем привет,

Я мог бы получить данные из SerialPort, но получает как 2 части. Обычно данные должны быть 01 02 00 0B 00 01 C8 08, но сначала записывают 01 в буфер, а затем получают 02 00 0B 00 01 C8 08.

Выход есть:
Нажмите, чтобы увидеть изображение журнала С форума MSDN

Спасибо Вам за вашу помощь

Что я уже пробовал:

Мои коды приведены ниже:
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
       byte[] buff = new byte[port.BytesToRead];
       Console.WriteLine(port.BytesToRead);
       port.Read(buff, 0, buff.Length);
       SetText(buff);
}

1 Ответов

Рейтинг:
4

Jochen Arndt

Вы обрабатываете получение в асинхронном событии. Это срабатывает, когда появляются новые данные. В вашем случае port.BytesToRead это одно с первым событием. Как только событие было обработано (один байт считан), оно возвращается. Тем временем были получены дополнительные байты, и событие было вызвано снова.

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


alidayan

Когда я добавляю порт.Напишите, что моя проблема решена. Это касается протокола modbus я думаю что устройство ждало ответа

OriginalGriff

Не имеет значения - то, что говорит Йохен, верно: именно так работают последовательные данные. Как только данные будут доступны, вы получите событие - и порт не "знает" о протоколе, он просто получает байты, когда они приходят один за другим. Если ваше удаленное устройство отправляет сообщение длиной более одного символа, вы почти наверняка получите несколько запускаемых событий, и вы обнаружите, что таинственным образом "теряете данные", потому что более поздние отдельные символы перезаписывают предыдущие. Конечно, если ваш компьютер не очень медленный или загруженный - 9600 бод позволяет передавать максимум около 1000 символов в секунду!

Jochen Arndt

В дополнение к тому, что сказал Грифф:

Вставка записи не решит проблему. Хотя он может работать в вашей системе, он может не работать в других системах.

OriginalGriff

Получает свою пятерку.

Jochen Arndt

Спасибо Вам за пятерку и особенно за ваш комментарий.