110,529
社区成员
发帖
与我相关
我的任务
分享
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct MonitorCPSBStruct
{
/// <summary>
/// 帧头信息
/// </summary>
[MarshalAs(UnmanagedType.I1, SizeConst = 1)]
public byte Head;
/// <summary>
/// 地址
/// </summary>
[MarshalAs(UnmanagedType.I1, SizeConst = 1)]
public byte Addr;
/// <summary>
/// 命令
/// </summary>
[MarshalAs(UnmanagedType.I1, SizeConst = 1)]
public byte Cmd;
/// <summary>
/// 数据帧长度
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] DataFrameLength;
/// <summary>
/// 提要
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] Content;
/// <summary>
/// 图像个数
/// </summary>
[MarshalAs(UnmanagedType.I1, SizeConst = 1)]
public byte PictureNum;
//这里该怎么定义图片信息?
}
var data=串口或其他硬件获取数据();
var 头=data[0];
var 地址=data[1];
var 命令=data[2];
var 数据总长度=getInt(data.take(3).skip(4));
var 摘要=getString(data.take(7),skip(16));
var 图像个数=data[22];
for 图像个数
{
var 当前图形长度=data[23];
var 当前图形=getImage(data.skip(23).take(当前图形长度));
}
当然循环体里是要根据次数以及长度做增加,伪代码而已...
所以这样一来不就能解析了?
当然这只是你收到信息做解析 做显示. 如果你要是根据协议发送数据 其实也简单 无非就是构造一大堆byte[]而已啊.
var data=list<byte>();
data.add(头)
data.add......
var img=getbyte("d://1.jpg");
data.add(img.length);
data.addrange(img);
data,add(尾);
struct 数据头
{
public byte 帧头; // 1 起始位
public byte 地址; // 1
public byte 命令; // 1
public int 数据帧长度; // 4 int
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] 提要; // 16 char
public byte 图像个数; // 1 不知道到底几个
}
先读数据头,再根据 图像个数,接收数据。