Получение неравномерных результатов от последовательного порта в C# - PullRequest
1 голос
/ 06 февраля 2020

У меня 2 GUI приложения, одно на C ++ и одно на C#. Приложения одинаковы, и есть функция, которая пишет и читает из COM-порта. Когда я запускаю свое приложение C ++, я получаю правильный результат от Serial.Read, который является буфером с 24 байтами. Но когда я запускаю свое приложение C#, я получаю неровные результаты: * Просто 1-байтовый буфер, если я не помещаю сон между записью и чтением. * Различных размеров, если я помещаю сон между записью и чтением (между 10-22 байтами).

Что может быть причиной этого?

Мой код C ++:

serial.write(&c, 1, &written);
serial.read(read_buf, read_len, &received); // received = 24 

Мой C# код:

serial.Write(temp_char, 0, 1);
received = serial.Read(read_buff, 0,read_len); // received = 1

C# со сном:

serial.Write(temp_char, 0, 1);
Thread.Sleep(100);
received = serial.Read(read_buff, 0,read_len); // received = (10~22)

1 Ответ

0 голосов
/ 06 февраля 2020

Последовательные порты просто дают поток байтов, они не знают, как вы записали в них блоки данных. Когда вы вызываете read, полученные байты возвращаются, и если это не полное сообщение, вам нужно повторно вызывать read до тех пор, пока не будет получено все сообщение.

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

...