我有输入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;
}
}