KaimeiRFMatchConnection.cs 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using Aitex.Core.RT.Log;
  2. using MECF.Framework.Common.Communications;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.IO.Ports;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.RFMatchs.Kaimei
  10. {
  11. public class KaimeiRFMatchMessage : BinaryMessage
  12. {
  13. public string Command { get; set; }
  14. public string ErrorCode { get; set; }
  15. public byte[] Data { get; set; }
  16. }
  17. public class KaimeiRFMatchConnection : SerialPortConnectionBase
  18. {
  19. private List<byte> _msgBuffer = new List<byte>();
  20. public KaimeiRFMatchConnection(string portName, int baudRate = 38400, int dataBits = 8, Parity parity = Parity.None, StopBits stopBits = StopBits.One)
  21. : base(portName, baudRate, dataBits, parity, stopBits, "", false)
  22. {
  23. }
  24. public override bool SendMessage(byte[] message)
  25. {
  26. return base.SendMessage(message);
  27. }
  28. protected override MessageBase ParseResponse(byte[] rawMessage)
  29. {
  30. KaimeiRFMatchMessage msg = new KaimeiRFMatchMessage();
  31. if (rawMessage == null || rawMessage.Length < 1)
  32. {
  33. return null;
  34. }
  35. _msgBuffer.AddRange(rawMessage);
  36. if (_msgBuffer.Count < 5)
  37. {
  38. return msg;
  39. }
  40. if(_msgBuffer[1] == 0x03)
  41. {
  42. var dataLength = _msgBuffer[2];
  43. if(_msgBuffer.Count < 3 + dataLength + 2)
  44. {
  45. return msg;
  46. }
  47. else
  48. {
  49. msg.RawMessage = _msgBuffer.Take(3 + dataLength + 2).ToArray();
  50. msg.Data = _msgBuffer.Skip(3).Take(dataLength).ToArray();
  51. _msgBuffer.RemoveRange(0, msg.RawMessage.Length);
  52. msg.IsResponse = true;
  53. msg.IsAck = true;
  54. msg.IsComplete = true;
  55. return msg;
  56. }
  57. }
  58. else if(_msgBuffer[1] == 0x10)
  59. {
  60. //SlaveAddress,FunctionCode,StartingAddressHigh,StartingAddressLow,NumberAddressHigh,NumberAddressLow,CRC,CRC
  61. if(_msgBuffer.Count < 8)
  62. {
  63. return msg;
  64. }
  65. else
  66. {
  67. msg.RawMessage = _msgBuffer.Take(8).ToArray();
  68. _msgBuffer.RemoveRange(0, msg.RawMessage.Length);
  69. msg.IsResponse = true;
  70. msg.IsAck = true;
  71. msg.IsComplete = true;
  72. return msg;
  73. }
  74. }
  75. else
  76. {
  77. msg.IsFormatError = true;
  78. LOG.Error($"invalid response");
  79. return msg;
  80. }
  81. }
  82. }
  83. }