2013-07-10 6 views
1

Я пытаюсь прочитать байты от сканера, подключенного к COM-порту, в массив байтов. В библиотеке Serial Port на C# уже есть функция Read, это функция, которую я использую для попытки чтения. У меня есть настройка так, чтобы прочитанные байты выводятся на консоль. Я работаю с протоколом, который очень предсказуем, поэтому я знаю, какой массив байтов я ожидаю, когда передаю эту строку в коде. Однако, если я запускаю программу, я получаю только один байт. Если я заново запустил тот же самый экземпляр программы (отправив ту же команду чтения), я получу оставшиеся ожидаемые байты. Только после того, как я запустил это в третий раз, я получу все байты, которые я ожидаю. Эта проблема полностью устранена, хотя, если я просто вставлю точку останова по строке чтения и перешагнув эту строку. Если я это сделаю, я получаю полный доступ каждый раз. Мой вопрос в том, как я могу получить полное чтение каждый раз, не вставляя точку останова? Я попытался использовать подход System Pause, чтобы остановить выполнение, и позволить COM-порту сканировать достаточно быстро, что не сработало. Я также пробовал использовать поток (см. Код ниже). Это тоже не сработало. Какие-либо предложения?Неполный последовательный порт Чтение C#

t = new Thread(() => device.Read(buffer)); 
    t.Start(); 
    t.Join(); 

Опять же, мой ожидаемый результат приходит только в полном пакете после повторной отправки команды чтения несколько раз или перешагивая вышеупомянутые команды с точкой останова. В противном случае я получаю ожидаемый результат в небольших «байтовых размерах». Любая помощь приветствуется!

+0

Ваш код недопустим, нет функции 'SerialPort', которая принимает только массив байтов. Единственной функцией 'Read' являются [оба] (http://msdn.microsoft.com/en-us/library/ms143549.aspx) [есть] (http://msdn.microsoft.com/en-us /library/34t733fh.aspx) три параметра –

+2

Почему бы не использовать данные последовательного порта для данных, чтобы получить данные? Нет необходимости использовать дополнительные потоки, поскольку обработчик, обработанный данными, находится в своем потоке. – user2019047

+0

Чтение перегружено, чтобы принять байтовый массив –

ответ

3

Ожидаемое поведение с байтовыми потоками. Циклируйте вокруг считывания и накачки, сколько бы байтов, полученных один за другим, в ваш экземпляр класса ProtocolUnit (или что-то еще), пока он не будет завершен и не проверен.

+0

[Stream.Read] (http://msdn.microsoft.com/en-us/library/System.IO.Stream.Read.aspx) имеет хороший пример правильного пути называть 'Read' –

0

Я недавно опубликовал подобный вопрос найти здесь: SerialPort.DataReceived Returning Strange Results

Проблема заключается в том, как вы знаете, программа пытается прочитать из буфера без каких-либо гарантий, что устройство закончило выдавать ту команду, он работает. Мой совет для реализации первого ответа на этот пост: Reading from the serial port in C#

Моя реализация выглядит следующим образом в случае DataReceived:

void serialPort_DataReceived(object s, SerialDataReceivedEventArgs e) 
    { 
     byte[] data = new byte[serialPort.BytesToRead]; 
     serialPort.Read(data, 0, data.Length); 
     Console.Write(System.Text.Encoding.UTF8.GetString(data)); 
    } 

И просто подключить его в коде:

serialPort.DataReceived += serialPort_DataReceived; 
0

Лучший подход для включения цикла while, а также дать 10 миллисекунды времени сна в промежутке между байтом чтения. Это даст 10 миллисекунд сканеру для записи данных на COM-порт. На самом деле проблема возникает при подключении сканера в сетевом порту.

Вы также можете написать делегат или событие, которое будет уведомлять, когда данные полностью считываются со сканера.

Смежные вопросы