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

标签 c# matlab serial-port

我用 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("-", " ");
    }
}

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

关于c# - 如何在没有任何编码的情况下从串口读取二进制数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33365408/

相关文章:

c# - 表值可选参数

arrays - 初始化没有零的数组

python - 循环次数可变的嵌套循环

android - USB/RS232通信安全异常android.permission.sec.MDM_APP_MGMT

C# SerialPort 编码转换为 byte[]

c# - 无法生成显式迁移,因为以下显式迁移处于挂起状态

c# - Application Insights 不从 ApplicationInsights.config 中获取 Instrumentation Key

matlab - 在 Matlab 中求解三角方程

serial-port - AT+GCAP & co. 有回复吗?告诉 "I' m 不是调制解调器,走开”?

c# - GraphDiff 也可以用于简单实体的部分更新吗?