我如何转换byteArray对象从SerialPort



我有输入COM端口。我从binary接收数据。问题是我不能把binary转换成object

I try this.

private void dataRecieved(object sender, SerialDataReceivedEventArgs e)
{
var dataLength = _serialPort.BytesToRead;
var data = new byte[dataLength];
int nbrData = _serialPort.Read(data, 0, dataLength);
var Data = _serialPort.Encoding.GetString(data);
}
public object ByteArrayToObject(byte[] arrBytes)
{
BinaryFormatter bf = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream(arrBytes))
{
object obj = bf.Deserialize(ms);
return obj;
}
}

抛出异常object obj = bf.Deserialize(ms);

System.Runtime.Serialization.SerializationException: The input stream is not a valid binary format. The starting contents (in bytes) are: 02-02-CC-CC-33-33-53-40-33-33-83-40-66-66-A6-40-9A

如何解决?答案将被评估。

编辑

我有Ardunio系统。Ardunio在SerialPort上发送binary格式的数据。这个数据实际上是object。对象。

typedef struct MainCompPacket {
uint8_t status;
uint8_t sensorStatus;
float pressure;  // mb
float accX;      // g
float accY;      // g
float accZ;      // g
float gyroX;     // deg/s
float gyroY;     // deg/s
float gyroZ;     // deg/s
double latitude;
double longitude;
} MainCompPacket; 

我应该在WPF应用程序中获取数据。我不能,因为这个数据是binary格式。我不能干涉阿杜尼奥系统。如果我可以,我改变发送json格式。

正如@padeso所说。二进制格式需要转换为对象的方案。

首先创建c# side结构体。相同的二进制数据方案。其次,我创建转换过程的静态方法。最后,我使用Marshal并将二进制文件转换为对象

public struct MainCompPacket 
{
byte status;
byte sensorStatus;
float pressure;  // mb
float accX;      // g
float accY;      // g
float accZ;      // g
float gyroX;     // deg/s
float gyroY;     // deg/s
float gyroZ;     // deg/s
double latitude;
double longitude;
public static MainCompPacket FromBytes(byte[] bytes)
{
GCHandle gcHandle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
var data = (MainCompPacket)Marshal.PtrToStructure(gcHandle.AddrOfPinnedObject(), typeof(Data));
gcHandle.Free();
return data;
}
}

相关内容

  • 没有找到相关文章

最新更新