using SerialPortUtility; using System.Collections.Generic; using UnityEngine; public class ArrowSerialPort : MonoBehaviour { private SerialPortUtilityPro serialPortUtility; private SerialPortUtilityPro.OpenSystem openMode = SerialPortUtilityPro.OpenSystem.PCI; private int baudrate = 115200; private string PortName = "/dev/ttyS1"; private static bool _isInit = false; public bool testMode = false; private void Awake() { if (!_isInit) { DontDestroyOnLoad(gameObject); Init(); } } private void LOG(string msg) { Debug.Log($"{msg}"); } private void Init() { _isInit = true; serialPortUtility = gameObject.GetComponent(); serialPortUtility.OpenMethod = openMode; serialPortUtility.DeviceName = PortName; serialPortUtility.BaudRate = baudrate; serialPortUtility.StopBit = SerialPortUtilityPro.StopBitEnum.OneBit; serialPortUtility.DataBit = SerialPortUtilityPro.DataBitEnum.EightBit; serialPortUtility.Open(); LOG($"{PortName} 串口打开"); #if UNITY_EDITOR if (testMode) { var testBoard = Resources.Load("SerialPortTest"); GameObject.Instantiate(testBoard); } #endif } private void OnDestroy() { LOG($"{PortName} 串口关闭"); serialPortUtility.Close(); } /// /// 串口读取二进制流数据(界面挂载调用) /// /// public void ReadStreamingBinary(object data) { PhraseData(data as byte[]); } public void TestRead(byte[] bytes) { PhraseData(bytes); } /// /// 解析串口数据 /// /// private void PhraseData(byte[] bytes) { Debug.Log($"{PortName} 收到串口信息!"); if (bytes[0] == 0xAA) { var cmdID = bytes[1]; switch (cmdID) { case 0x80://设备信息响应 OnDeviceInfoBack(bytes); break; case 0x81://射击消息 OnDeviceShoot(bytes); break; case 0x82://按键消息 OnDeviceButton(bytes); break; } } } #region APP请求 // 异或校验内容:命令+长度+数据内容 /// /// app请求设备信息 /// public void RequestDeviceIno() { List data = new List(); data[0] = 0xAA;//起始码 data[1] = 0x80;//命令号 data[2] = 0x05;//长度 data[3] = 0x85;//异或校验 data[4] = 0x55;//结束码 serialPortUtility.Write(data.ToArray()); } #endregion #region 返回消息处理 /// /// 设备信息响应 /// private void OnDeviceInfoBack(byte[] bytes) { Debug.Log($"{PortName} 收到设备信息响应!"); } /// /// 射击消息 /// private void OnDeviceShoot(byte[] bytes) { Debug.Log($"{PortName} 收到设备射击消息!"); } /// /// 按键消息 /// /// private void OnDeviceButton(byte[] bytes) { Debug.Log($"{PortName} 收到设备按键消息!"); var buttonType = bytes[3];//按键类型 // 0x01 开机键 - 短按 // 0x02 开机键 - 长按(1.5 秒) // 0x03 开机键 - 双击 // 0x04 标定键 - 短按 // 0x05 标定键 - 长按(1.5 秒) // 0x06 标定键 - 双击 } #endregion }