ArrowSerialPort.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. using SerialPortUtility;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class ArrowSerialPort : MonoBehaviour
  5. {
  6. private SerialPortUtilityPro serialPortUtility;
  7. private SerialPortUtilityPro.OpenSystem openMode = SerialPortUtilityPro.OpenSystem.PCI;
  8. private int baudrate = 115200;
  9. private string PortName = "/dev/ttyS1";
  10. private static bool _isInit = false;
  11. public bool testMode = false;
  12. private void Awake()
  13. {
  14. if (!_isInit)
  15. {
  16. DontDestroyOnLoad(gameObject);
  17. Init();
  18. }
  19. }
  20. private void LOG(string msg)
  21. {
  22. Debug.Log($"<color=#00FF00>{msg}</color>");
  23. }
  24. private void Init()
  25. {
  26. _isInit = true;
  27. serialPortUtility = gameObject.GetComponent<SerialPortUtilityPro>();
  28. serialPortUtility.OpenMethod = openMode;
  29. serialPortUtility.DeviceName = PortName;
  30. serialPortUtility.BaudRate = baudrate;
  31. serialPortUtility.StopBit = SerialPortUtilityPro.StopBitEnum.OneBit;
  32. serialPortUtility.DataBit = SerialPortUtilityPro.DataBitEnum.EightBit;
  33. serialPortUtility.Open();
  34. LOG($"{PortName} 串口打开");
  35. #if UNITY_EDITOR
  36. if (testMode)
  37. {
  38. var testBoard = Resources.Load<GameObject>("SerialPortTest");
  39. GameObject.Instantiate(testBoard);
  40. }
  41. #endif
  42. }
  43. private void OnDestroy()
  44. {
  45. LOG($"{PortName} 串口关闭");
  46. serialPortUtility.Close();
  47. }
  48. /// <summary>
  49. /// 串口读取二进制流数据(界面挂载调用)
  50. /// </summary>
  51. /// <param name="data"></param>
  52. public void ReadStreamingBinary(object data)
  53. {
  54. PhraseData(data as byte[]);
  55. }
  56. public void TestRead(byte[] bytes)
  57. {
  58. PhraseData(bytes);
  59. }
  60. /// <summary>
  61. /// 解析串口数据
  62. /// </summary>
  63. /// <param name="bytes"></param>
  64. private void PhraseData(byte[] bytes)
  65. {
  66. Debug.Log($"{PortName} 收到串口信息!");
  67. if (bytes[0] == 0xAA)
  68. {
  69. var cmdID = bytes[1];
  70. switch (cmdID)
  71. {
  72. case 0x80://设备信息响应
  73. OnDeviceInfoBack(bytes);
  74. break;
  75. case 0x81://射击消息
  76. OnDeviceShoot(bytes);
  77. break;
  78. case 0x82://按键消息
  79. OnDeviceButton(bytes);
  80. break;
  81. }
  82. }
  83. }
  84. #region APP请求
  85. // 异或校验内容:命令+长度+数据内容
  86. /// <summary>
  87. /// app请求设备信息
  88. /// </summary>
  89. public void RequestDeviceIno()
  90. {
  91. List<byte> data = new List<byte>();
  92. data[0] = 0xAA;//起始码
  93. data[1] = 0x80;//命令号
  94. data[2] = 0x05;//长度
  95. data[3] = 0x85;//异或校验
  96. data[4] = 0x55;//结束码
  97. serialPortUtility.Write(data.ToArray());
  98. }
  99. #endregion
  100. #region 返回消息处理
  101. /// <summary>
  102. /// 设备信息响应
  103. /// </summary>
  104. private void OnDeviceInfoBack(byte[] bytes)
  105. {
  106. Debug.Log($"{PortName} 收到设备信息响应!");
  107. }
  108. /// <summary>
  109. /// 射击消息
  110. /// </summary>
  111. private void OnDeviceShoot(byte[] bytes)
  112. {
  113. Debug.Log($"{PortName} 收到设备射击消息!");
  114. }
  115. /// <summary>
  116. /// 按键消息
  117. /// </summary>
  118. /// <param name="bytes"></param>
  119. private void OnDeviceButton(byte[] bytes)
  120. {
  121. Debug.Log($"{PortName} 收到设备按键消息!");
  122. var buttonType = bytes[3];//按键类型
  123. // 0x01 开机键 - 短按
  124. // 0x02 开机键 - 长按(1.5 秒)
  125. // 0x03 开机键 - 双击
  126. // 0x04 标定键 - 短按
  127. // 0x05 标定键 - 长按(1.5 秒)
  128. // 0x06 标定键 - 双击
  129. }
  130. #endregion
  131. }