繁体   English   中英

如何从串口读取二进制数据而不进行任何编码?

[英]How to read Binary Data from Serial Port without any Encoding?

我开发了一个应用程序来从C#中的SerialPort读取数据。 它的工作正常。 但从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 string Data;
    public SerialDataEventArgs(string dataInByteArray)
    {
        Data = dataInByteArray;
    }

}

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

您的代码正在从字节数组构造一个System.String实例,它将尝试使用默认编码从字节中形成有效的文本值,无论您的系统是什么。

您需要更改SerialDataEventArgs类以使用byte[]而不是string或使用BitConverter.ToString(data)或类似方法将字节数组转换为十六进制数字字符串。 就像是:

//class SerialDataEventArgs
public class SerialDataEventArgs : EventArgs
{
    public string Data;
    public SerialDataEventArgs(byte dataInByteArray)
    {
        Data = BitConverter.ToString(dataInByteArray).Replace("-", " ");
    }
}

这将为您提供字节的十六进制值,每个字节用空格分隔。 我个人认为失去一些实用工具....如果你想将数据写入屏幕供用户查看但是将其保存为实际数据处理的字节数组,那么从字节数组转换更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM