VR Karthikeyan Ответов: 2

Как читать двоичные данные из последовательного порта без какой-либо кодировки?


Привет,

Я разработал приложение для чтения данных из SerialPort на языке C#. Он работает нормально. Но данные, считанные из SerialPort, отличаются от того, что я ожидал.

Когда я читаю порт с помощью XCTU или Matlab он дает следующие данные,
00 00 e2 00 40 74 95 07 02 25 14 00 8a 92 00 77 ff

Но когда я читаю те же данные из приложения C#, оно дает,
8C3F275A483F

Я ожидаю получить результирующие данные приложения C#, такие как результат работы Matlab и XCTU. Я пробовал использовать кодировки SerialPort (ASCIIEncoding, Unicode, Latin). Но ничего не работает. Помоги мне. это мой код,
//DataReceived event handler
public event EventHandler<SerialDataEventArgs> NewSerialDataRecieved;
//Serial Port Initialization
SerialPort _serialPort = new SerialPort("COM3",9600,Parity.None,8,StopBits.One);
_serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived);
_serialPort.Open();

//DataReceived event
void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    int dataLength = _serialPort.BytesToRead;
    byte[] data = new byte[dataLength];
    int nbrDataRead = _serialPort.Read(data, 0, dataLength);
    if (nbrDataRead == 0)
        return;
    
    if (NewSerialDataRecieved != null)
        NewSerialDataRecieved(this, new SerialDataEventArgs(data));
}

//class SerialDataEventArgs
public class SerialDataEventArgs : EventArgs
{
    public byte[] Data;
    public SerialDataEventArgs(byte[] dataInByteArray)
    {
        Data = dataInByteArray;
    }
    
}

//printing the read data
string str = BitConverter.ToString(e.Data);
txtData.AppendText(str);//txtData is a TextBox

[no name]

Код?

VR Karthikeyan

@pwasser Привет, я добавил свой код в вопрос

Alan N

Это правильный код? Массив байтов "data", считанный из порта, присваивается строке в SerialDataEventArgs.

VR Karthikeyan

Извините, я забыл упомянуть, что использую BitConverter для преобразования данных (байтовый массив) в строку. Отредактировано в вопросе.

Alan N

... и это означает, что определение класса SerialDataEventArgs не может быть правильным. Пожалуйста, ознакомьтесь со всем опубликованным кодом.

2 Ответов

Рейтинг:
16

Patrice T

Цитата:
Я ожидаю получить результирующие данные приложения C#, такие как результат работы Matlab и XCTU. Я пробовал использовать кодировки SerialPort (ASCIIEncoding, Unicode, Latin). Но ничего не работает. Помоги мне. это мой код,
Хитрость проста: вы получаете двоичные данные из последовательного порта, а не конвертируете их.
Ваши данные содержат некоторые bytes которые не преобразуются ни в какую схему кодирования, это просто двоичные значения (00 07 02 14), все зависит от устройства, которое отправляет данные. Если это не относится к конкретному устройству, то единственная возможность заключается в том, что данные содержат некоторое значение с плавающей запятой, отправленное в двоичной форме.

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


Member 12683722

Привет, ppolymorphe, я новичок в программировании.
У меня такая же проблема с ВР Картикеяном.

Мне не удалось получить двоичные данные из серийного номера, а затем преобразовать их в шестнадцатеричный.
Не могли бы вы мне помочь? Какой код я должен использовать??
Или, может быть, полный исходный код.?

Спасибо

Patrice T

Откройте новый вопрос с информацией о вашей проблеме.

Рейтинг:
1

coarist

Эта часть В. Р. Картикеянкод s:

//printing the read data
string str = BitConverter.ToString(e.Data);
txtData.AppendText(str);//txtData is a TextBox
Чтобы получить желаемый результат 00 00 e2 00 ......, измените вышеприведенный блок, чтобы использовать строковый форматер "X", как это:
foreach (byte i in e.Data)
{
    // i is byte value, two hexadecimal digit is enough
    // to hold its value (max 255, hex FF). For illustration
    // space is appended after each byte printout. 
    string str2 = i.ToString("X2").Append(" ");
    txtData.AppendText(str2);
}
Тем не менее, это выполняется медленно из-за добавления текста к txtData это текстовое поле. Когда byte[] велик, разница в скорости показывает. В этом случае используйте эту технику для улучшения воспринимаемой производительности, главным образом перемещая .метод appendtext() работа вне цикла:
using System.Text;

StringBuilder s = new StringBuilder();
foreach (byte i in e.Data)
{
    s.Append(i.ToString("X2")).Append(" ");
}
txtData.AppendText(s.ToString());
О методах, используемых класс StringBuilder чтобы собрать результаты преобразования всех байтов в массиве е.Сведения. Когда цикл foreach завершится, txtData добавляется на одном дыхании. Чтобы закончить это, В. Р. Картикеянкод s может быть написан следующим образом:
//-----------------------------------------------------------------
// StringBuilder class use this name space to import
//-----------------------------------------------------------------
using System.Text;

//-----------------------------------------------------------------
// The code snapshot, portion to print out the byte array fast
//-----------------------------------------------------------------
txtData.AppendText(OurOwnConverter(e.Data)); //txtData is a TextBox

//-----------------------------------------------------------------
// A formatter function is used to wrap up the converstion
//-----------------------------------------------------------------
string OurOwnConverter(byte[] byteArray)
{
    StringBuilder s = new StringBuilder();
    foreach (byte i in byteArray)
    {
        s.Append(i.ToString("X2")).Append(" ");
    }
    return s.ToString();
}