C# 如何在没有任何编码的情况下从串行端口读取二进制数据?

C# 如何在没有任何编码的情况下从串行端口读取二进制数据?,c#,matlab,serial-port,C#,Matlab,Serial Port,我开发了一个从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的结果。我尝试过串行端口编码(ascienceoding、Unicode、拉丁文)。但什么都不管用。帮

我开发了一个从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的结果。我尝试过串行端口编码(ascienceoding、Unicode、拉丁文)。但什么都不管用。帮助我。这是我的密码

//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
//DataReceived事件处理程序
公共事件事件处理程序NewSerialDataReceived;
//串口初始化
SerialPort _SerialPort=新的串行端口(“COM3”,9600,奇偶校验。无,8,停止位。1);
_serialPort.DataReceived+=新的SerialDataReceiveDevenHandler(\u serialPort\u DataReceived);
_serialPort.Open();
//DataReceived事件
void\u serialPort\u DataReceived(对象发送方,SerialDataReceivedEventArgs e)
{
int dataLength=_serialPort.BytesToRead;
字节[]数据=新字节[dataLength];
int nbrDataRead=_serialPort.Read(数据,0,数据长度);
如果(nbrDataRead==0)
返回;
如果(NewSerialDataReceived!=null)
NewSerialDataReceived(这是新的SerialDataEventArgs(数据));
}
//类SerialDataEventArgs
公共类SerialDataEventArgs:EventArgs
{
公共字符串数据;
public SerialDataEventArgs(字符串dataInByteArray)
{
数据=数据字节数组;
}
}
//打印读取的数据
string str=BitConverter.ToString(例如数据);
txtData.AppendText(str)//txtData是一个文本框

您的代码正在从字节数组构造一个
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("-", " ");
    }
}

这将为您提供字节的十六进制值,每个字节之间用空格分隔。就我个人而言,我认为这会失去一些效用。。。。如果您想将数据写入屏幕供用户查看,但将其作为字节数组保存以进行实际数据处理,则最好从字节数组进行转换。

1。您发布了两个数据示例:它们是由两个不同程序读取的相同数据吗?2.你想读什么设备?该设备是否有关于它发送给您的内容的文档?谢谢Corey,我已经尝试过了,但它提供的数据类似于8C3F275A483F。实际上,我正在使用rfid读卡器读取rfid卡,当我使用matlab读取它时,它会给出00 00 e2 00 40 74 95 07 02 25 14 00 8a 92 00 77 ff,而使用我的c#app读取同一张卡时,它会给出类似8C3F275A483F的输出。我无法理解这两个数据之间的关系。Matlab提供原始数据,它需要我的c#app中的原始数据,有什么方法可以实现这一点吗?你能确认数据缓冲区在读取后包含字节
8c3f275a483f
?如果是这样,则串行端口初始化代码可能有问题。检查数据速率和帧位。。。如果读卡器以9600波特的速度发送8N1,而您正在接收其他格式或数据速率,这可以解释不同的接收数据。