Files
ParkingRobot/MedullaAdapter/PackageStruct.cs
T
2026-07-21 11:11:01 +08:00

169 lines
5.5 KiB
C#

using System;
namespace MedullaAdapter
{
public class BasePack
{
private static ushort CalculateCRC16(byte[] data)
{
const ushort polynomial = 0xA001; // CRC-16-IBM多项式
ushort crc = 0xFFFF; // 初始值
foreach (byte b in data)
{
crc ^= b; // 将数据字节与CRC寄存器按位异或
for (int i = 0; i < 8; i++)
{
if ((crc & 0x0001) != 0)
{
crc >>= 1;
crc ^= polynomial;
}
else
{
crc >>= 1;
}
}
}
return crc;
}
private byte[] _data;
public void SetData(byte[] data)
{
_data = data;
}
public byte[] GetPack()
{
var pack = new byte[_data.Length+7];
pack[0] = 0xBB;
pack[1] = 0xAA;
var length = BitConverter.GetBytes(_data.Length);
pack[2] = length[0];
pack[3] = length[1];
for (int i = 0; i < _data.Length; i++)
{
pack[4+i] = _data[i];
}
var crcByes = new byte[pack.Length - 5];
Array.Copy(pack,2,crcByes,0,crcByes.Length);
var crc = BitConverter.GetBytes(CalculateCRC16(crcByes));
pack[pack.Length-1] = 0xEE;
pack[pack.Length-2] = crc[1];
pack[pack.Length-3] = crc[0];
return pack;
}
}
public class ControlPack : BasePack
{
public ControlPack(byte controlCode)
{
byte[] controlData = new byte[3]{0x01,0x00,controlCode};
SetData(controlData);
}
}
public class SetConfigPack : BasePack
{
public SetConfigPack(int can1BaudRate, int can2BaudRate,int modbus0BaudRate, int modbus1BaudRate, int modbus2BaudRate,
int serialBaudRate,int upperSize = 1024,int lowerSize =1024 )
{
var upper = BitConverter.GetBytes(upperSize);
var lower = BitConverter.GetBytes(lowerSize);
var can = BitConverter.GetBytes(can1BaudRate);
var can2 = BitConverter.GetBytes(can2BaudRate);
var modbus0 = BitConverter.GetBytes(modbus0BaudRate);
var modbus1 = BitConverter.GetBytes(modbus1BaudRate);
var modbus2 = BitConverter.GetBytes(modbus2BaudRate);
var serial = BitConverter.GetBytes(serialBaudRate);
var canBuffer = BitConverter.GetBytes(128);
var mbBuffer = BitConverter.GetBytes(512);
var serialBuffer = BitConverter.GetBytes(1024);
byte[] configData = new byte[]
{
0x01, 0x10, 0x02, upper[0], upper[1], upper[2], upper[3], lower[0], lower[1],
lower[2], lower[3], 0x06, 0x00, 0x00, can[0], can[1], can[2], can[3], canBuffer[0], canBuffer[1], 0x00,
can2[0], can2[1], can2[2], can2[3], canBuffer[0], canBuffer[1], 0x10, modbus0[0],
modbus0[1], modbus0[2], modbus0[3], mbBuffer[0], mbBuffer[1], 0x10, modbus1[0],
modbus1[1], modbus1[2], modbus1[3], mbBuffer[0], mbBuffer[1], 0x10, modbus2[0],
modbus2[1], modbus2[2], modbus2[3], mbBuffer[0], mbBuffer[1], 0x20, serial[0], serial[1], serial[2],
serial[3], serialBuffer[0], serialBuffer[1]
};
SetData(configData);
}
}
public class ReadConfigPack : BasePack
{
public ReadConfigPack()
{
var readConfigData = new byte[] { 0x01, 0x10, 0x00 };
SetData(readConfigData);
}
}
public class DownloadCodePack : BasePack
{
public DownloadCodePack(int totalLength, int offset, int currentLength, byte[] codeBytes)
{
var codeData = new byte[12 + codeBytes.Length];
codeData[0] = 0x01;
codeData[1] = 0x11;
var totalLengthBytes = BitConverter.GetBytes(totalLength);
for (int i = 0; i < 4; i++)
{
codeData[2 + i] = totalLengthBytes[i];
}
var offsetBytes = BitConverter.GetBytes(offset);
for (int i = 0; i < 4; i++)
{
codeData[6 + i] = offsetBytes[i];
}
var curLengthBytes = BitConverter.GetBytes(currentLength);
for (int i = 0; i < 2; i++)
{
codeData[10 + i] = curLengthBytes[i];
}
for (int i = 0; i < codeBytes.Length; i++)
{
codeData[12+i] = codeBytes[i];
}
SetData(codeData);
}
}
public class HeartBeatPack : BasePack
{
public HeartBeatPack(int state, int error)
{
var errorBytes = BitConverter.GetBytes(error);
var heartBearData = new byte[] { 0x01, 0xF0, (byte)state, errorBytes[0], errorBytes[1] };
SetData(heartBearData);
}
}
public class UpperIOPack : BasePack
{
public UpperIOPack(byte[] data,int size)
{
byte[] UpperData = new byte[6 + size];
UpperData[0] = 0x01;
UpperData[1] = 0x20;
var length = BitConverter.GetBytes(size);
for (int i = 0; i < 4; i++)
{
UpperData[2+i] = length[i];
}
Array.Copy(data,0,UpperData,6,size);
SetData(UpperData);
}
}
}