Sic03/FrameworkLocal/RTEquipmentLibrary/HardwareUnits/Robots/HirataRobot/HirataR4RobotConnection.cs

84 lines
2.6 KiB
C#

using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using Aitex.Core.RT.Log;
using MECF.Framework.Common.Communications;
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots.RobotHirataR4
{
public class HirataR4RobotMessage : AsciiMessage
{
public string Data { get; set; }
public string ErrorText { get; set; }
}
public class HirataR4RobotConnection : SerialPortConnectionBase
{
//private bool _isAckMode = false;//should read from config file
private string _cachedBuffer = string.Empty;
private List<byte> _lstCacheBuffer = new List<byte>();
public HirataR4RobotConnection(string portName, int baudRate = 19200, int dataBits = 7, Parity parity = Parity.Even, StopBits stopBits = StopBits.One)
: base(portName, baudRate, dataBits, parity, stopBits, "\0", false)
{
}
public override bool SendMessage(byte[] message)
{
_lstCacheBuffer.Clear();
return base.SendMessage(message);
}
protected override MessageBase ParseResponse(byte[] rawBuffer)
{
_lstCacheBuffer.AddRange(rawBuffer);
byte[] temps = _lstCacheBuffer.ToArray();
HirataR4RobotMessage msg = new HirataR4RobotMessage();
msg.IsFormatError = false;
msg.IsComplete = false;
msg.IsEvent = false;
if (temps.Length <= 7) return msg;
byte lrc = 0x00;
for (int i=1;i<temps.Length -1;i++)
{
lrc ^= temps[i];
}
if (temps[temps.Length - 1] != lrc) return msg;
string rawText = Encoding.ASCII.GetString(temps);
msg.RawMessage = rawText;
//remove '\0'
rawText = rawText.Substring(0, rawText.Length - 1);
string content = rawText.Substring(4, rawText.Length - 5).
Replace(Encoding.ASCII.GetString(new byte[] { 0x3 }), ""); ;
content = content.Trim();
if (content.First() == 'E')
{
msg.IsError = true;
}
msg.Data = content;
msg.IsResponse = true;
msg.IsAck = true;
msg.IsComplete = true;
_lstCacheBuffer.Clear();
return msg;
}
private static byte CalcLRC(List<byte> data)
{
byte ret = 0x00;
for (var i = 0; i < data.Count; i++)
{
ret ^= data[i];
}
return ret;
}
}
}