【问题标题】:How to read Binary Data from Serial Port without any Encoding?如何在没有任何编码的情况下从串口读取二进制数据?
【发布时间】:2015-10-27 10:25:54
【问题描述】:

我开发了一个应用程序来从 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

【问题讨论】:

  • 1.您发布了两个数据示例:它们是两个不同程序读取的相同数据吗? 2. 你想读什么设备?该设备是否有关于它向您发送什么的文档?

标签: c# matlab serial-port


【解决方案1】:

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

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

【讨论】:

  • 谢谢Corey,我已经尝试过了,但它给出的数据类似于8C3F275A483F。实际上我正在使用 rfid 读卡器读取 rfid 卡,当我用 matlab 读取它时,它会给出 00 00 e2 00 40 74 95 07 02 25 14 00 8a 92 00 77 ff ,同时用我的 c# 应用程序读取同一张卡,它会给出类似 8C3F275A483F 的输出。我无法理解这两个数据之间的关系。 Matlab 提供原始数据,它需要我的 c# 应用程序中的原始数据,有什么办法可以实现吗?
  • 您能否确认读取后数据缓冲区包含字节8C 3F 27 5A 48 3F?如果是这样,那么您的串行端口初始化代码可能有问题。检查数据速率和帧位...如果读卡器以 9600 波特率发送 8N1,而您收到的其他格式或数据速率可以解释不同的接收数据。
猜你喜欢
  • 2011-01-22
  • 1970-01-01
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多