принятый байт никогда не превышает 127 в последовательном порту - PullRequest
1 голос
/ 01 мая 2011

У меня есть программа, которая отправляет потоковые байты на другой компьютер. Значения находятся в диапазоне от 0 до 255. Я настроил свой серийный порт следующим образом

sp.BaudRate = 115200;
sp.PortName = "COM53";
sp.DataBits = 8;
sp.StopBits = System.IO.Ports.StopBits.One;
sp.Parity = System.IO.Ports.Parity.None;
sp.ReadTimeout = 0;
sp.Open();
sp.DataReceived += new
System.IO.Ports.SerialDataReceivedEventHandler(sp_ DataReceived);

и тогда у меня есть это

void sp_DataReceived(object sender,
System.IO.Ports.SerialDataReceivedEventArgs e)
{

string Mystring = sp.ReadExisting();
byte testbyte = 254;
// Gather all the bytes until 102 is reached
foreach (byte c in Mystring)
{
if(pixelcount<102)
pixel[pixelcount] = c;
pixelcount++;
if (c 126)
Console.WriteLine("big number {0}", c);// biggest number ever printed is 127
}
//got all the bytes, now draw them
if (pixelcount == 102)
{
Console.WriteLine("testbyte = {0}", testbyte);
oldx = 0;
pixelcount = 0;
pictureBox_rawData.Invalidate();
}
}

Моя проблема в том, что "с" никогда не бывает больше 127. Что мне здесь не хватает? Я проверил все кодирование, но я не могу решить эту проблему. пожалуйста, помогите.

спасибо int91h

Ответы [ 4 ]

6 голосов
/ 01 мая 2011

Если вы хотите получить необработанные байты, вы должны использовать SerialPort.Read , чтобы прочитать его в байтовый массив. Использование SerialPort.ReadExisting для чтения данных в строку приведет к некоторому преобразованию (то есть кодирование преобразует байты в символы).

3 голосов
/ 01 мая 2011

Вы не читаете байты, вы читаете текст.Который создается путем преобразования байтов, которые получает порт, в соответствии со значением свойства SerialPort.Encoding.По умолчанию используется Encoding.ASCII, кодировка, которая содержит символы только для значений байтов от 0 до 127. Значения байтов вне этого диапазона заменяются на «?».символ.

Что объясняет, что вы видите.Выбор другой кодировки маловероятен в вашем случае, используйте вместо этого SerialPort.Read ().Эквивалентом ReadExisting является вызов Read () с достаточно большим аргументом count .Вы получите все, что подходит, фактическое количество байтов, скопированных в буфер, является возвращаемым значением метода.Блокируется, когда входной буфер пуст.Это может произойти только в обработчике событий DataReceived, когда e.EventType не равен SerialData.Chars.Обычно это не проблема.

Помните, что ваш вызов pictureBox_rawData.Invalidate () недопустим.DataReceived работает в потоке потоков.Вы можете касаться только элементов управления в потоке пользовательского интерфейса.Вам нужно будет использовать Control.BeginInvoke ().

3 голосов
/ 01 мая 2011

В документации для SerialPort.Write (раздел «Примечания»):

По умолчанию SerialPort использует ASCIIEncoding для кодирования символов.ASCIIEncoding кодирует все символы больше 127 как (char) 63 или '?'.Чтобы поддерживать дополнительные символы в этом диапазоне, задайте для Encoding значение UTF8Encoding, UTF32Encoding или UnicodeEncoding.

Возможно, ReadExisting ведет себя аналогично и преобразует каждый байт, превышающий 127, в 63.

0 голосов
/ 26 февраля 2016

Как и сказал Ханс Пассант, вам нужно использовать SerialPort.Read ().

Примерно так будет работать

'retrieve number of bytes in the buffer
Dim bytes1 As Integer = ComPort.BytesToRead

'create a byte array to hold the awaiting data
Dim comBuffer As Byte() = New Byte(bytes1 - 1) {}

'read the data and store it to comBuffer
ComPort.Read(comBuffer, 0, bytes1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...