96 lines
2.9 KiB
C#
96 lines
2.9 KiB
C#
using System.Collections.Generic;
|
|
using System.IO.Ports;
|
|
using Aitex.Core.RT.Log;
|
|
using MECF.Framework.Common.Communications;
|
|
|
|
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.RFMatchs.AE
|
|
{
|
|
public class AeRfMatchMessage : BinaryMessage
|
|
{
|
|
public byte Header { get; set; }
|
|
public byte CommandNumber { get; set; }
|
|
public byte OptionLength { get; set; }
|
|
public byte[] Data { get; set; }
|
|
public byte CheckSum { get; set; }
|
|
|
|
public int Address { get; set; }
|
|
public int DataLength { get; set; }
|
|
|
|
public int MessageLength { get; set; }
|
|
}
|
|
|
|
public class AeRfMatchConnection : SerialPortConnectionBase
|
|
{
|
|
private List<byte> _lstCacheBuffer = new List<byte>();
|
|
|
|
public AeRfMatchConnection(string portName, int baudRate = 9600, int dataBits = 8, Parity parity = Parity.None, StopBits stopBits = StopBits.One)
|
|
: base(portName, baudRate, dataBits, parity, stopBits, "\r", false)
|
|
{
|
|
|
|
}
|
|
|
|
public override bool SendMessage(byte[] message)
|
|
{
|
|
_lstCacheBuffer.Clear();
|
|
return base.SendMessage(message);
|
|
}
|
|
|
|
protected override MessageBase ParseResponse(byte[] rawBuffer)
|
|
{
|
|
_lstCacheBuffer.AddRange(rawBuffer);
|
|
|
|
AeRfMatchMessage msg = new AeRfMatchMessage();
|
|
msg.RawMessage = rawBuffer;
|
|
|
|
if (_lstCacheBuffer.Count >= 1 && _lstCacheBuffer[0] == 0x06)
|
|
{
|
|
msg.IsAck = true;
|
|
_lstCacheBuffer.RemoveAt(0);
|
|
}
|
|
|
|
if (_lstCacheBuffer.Count < 4)
|
|
{
|
|
return msg;
|
|
}
|
|
|
|
msg.Header = _lstCacheBuffer[0];
|
|
msg.CommandNumber = _lstCacheBuffer[1];
|
|
msg.OptionLength = _lstCacheBuffer[2];
|
|
msg.Address = _lstCacheBuffer[0] >> 3;
|
|
msg.DataLength = (byte)(0x07 & _lstCacheBuffer[0]);
|
|
msg.MessageLength = 3 + msg.DataLength ;//3=包头+Cmd+校验
|
|
if (msg.DataLength >= 7)
|
|
{
|
|
msg.DataLength = _lstCacheBuffer[2];
|
|
msg.MessageLength = 4 + msg.DataLength ;//4=包头+Cmd+length+校验
|
|
}
|
|
|
|
if (_lstCacheBuffer.Count < msg.MessageLength)
|
|
return msg;
|
|
|
|
msg.Data = _lstCacheBuffer.GetRange(msg.DataLength >= 7 ? 3 : 2, msg.DataLength).ToArray();
|
|
|
|
byte sum = 0x00;
|
|
for (var i = 0; i < msg.MessageLength - 1; i++)
|
|
{
|
|
sum ^= _lstCacheBuffer[i];
|
|
}
|
|
|
|
if (_lstCacheBuffer[msg.MessageLength - 1] != sum)
|
|
{
|
|
LOG.Error($"check sum failed, ");
|
|
msg.IsFormatError = true;
|
|
_lstCacheBuffer.Clear();
|
|
return msg;
|
|
}
|
|
|
|
msg.IsResponse = true;
|
|
|
|
_lstCacheBuffer.RemoveRange(0, msg.MessageLength);
|
|
|
|
return msg;
|
|
}
|
|
|
|
}
|
|
}
|