Как получить массив байтов через последовательный порт
Привет Всем.
В настоящее время я учу себя C#, создавая приложение. Это медленный прогресс с большим количеством времени, потраченного на форумы, но все равно весело, тем не менее...
Что касается проблемы. Код, который я сделал, отправляет массив байтов и должен получить массив байтов обратно в качестве ответа. Я считаю, что моя проблема возникает, когда я пытаюсь сохранить полученное сообщение.
Лучший результат, который я получил до сих пор, состоял в том, чтобы сохранить полученный 1-й байт и ничего больше.
//this part is in my main code. myport.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) { if (!myport.IsOpen) return; //If port is closed exit int bytes = myport.BytesToRead; //find the size of the array needed byte[] buffer = new byte[bytes]; //create the array myport.Read(buffer, 0, bytes); //read the message and save it into the buffer byte[] ReceivedMessage = new byte[bytes]; //create an array of the same size Array.Copy(buffer, ReceivedMessage, bytes); //copy it across }
После выполнения этой части кода в "ReceivedMessage" сохраняется только первый байт, а все остальное-ноль. Предполагается, что полученное сообщение имеет длину 25 байт.
Что я уже пробовал:
Тестирование полученного сообщения, чтобы увидеть, все ли это проходит (это происходит).
Пробовал разные формы команды чтения (похоже, это не очень помогает).
Richard MacCutchan
Это, скорее всего, потому, что Вы читаете только первый байт. Последовательные порты работают чрезвычайно медленно, и вам нужно постоянно проверять, есть ли какие-либо данные, готовые к чтению, вы не можете предполагать, что получите полное сообщение с первой попытки.
Terrence13
Спасибо за ответ, Ричард.
Да, в этом есть большой смысл. Есть ли способ заставить мой код подождать, пока он не получит все 25 байт и не заполнит массив, прежде чем продолжить?
Я попытался сделать это с помощью ReadLine, но это вызвало бесконечный цикл.
Richard MacCutchan
> После выполнения этой части кода в "ReceivedMessage" сохраняется только первый байт, а все остальное-ноль.
& gt; тестирование полученного сообщения, чтобы увидеть, все ли оно проходит (оно проходит).
Оба эти утверждения не могут быть истинными.
PIEBALDconsult
Я думаю, вы получите байт _last_.
Массив.Копия (буфер, ReceivedMessage, байты);
"байты "здесь должны быть" 0"?