using System.Collections; using System.Collections.Generic; using UnityEngine; using System; public class UnitySerialPort : MonoBehaviour { public string ComPort = "/dev/ttyS7"; // Current baud rate and set of default // 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200 public int BaudRate = 9600; private AndroidJavaClass androidJavaClass; private AndroidJavaObject androidJavaObject; private void Start() { //不用删除 DontDestroyOnLoad(gameObject); androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); //androidJavaObject = androidJavaClass.GetStatic("currentActivity"); androidJavaObject = new AndroidJavaObject("com.example.serialport.serialport"); //初始化端口 initSerialPort(); } private void OnDestroy() { //关闭端口 Close(); } //测试通信 public void unityCallAndroid() { androidJavaObject.Call("UnityCallAndroid"); Debug.Log("Unity调用Android的UnityCallAndroid方法"); } public void UnityMethod(string text) { Debug.Log("java 调用 unity :"+ text); } //初始化端口 public void initSerialPort() { //comName,boardRate bool bOpen = androidJavaObject.CallStatic("initSerialPort", new object[]{ ComPort, BaudRate }); //Debug.Log("Unity调用Android的initSerialport方法"); if (bOpen) { Debug.Log("initSerialPort 初始化成功!"); ToastShow("initSerialPort 初始化成功!"); } else { Debug.LogError("initSerialPort 初始化失败!"); ToastShow("initSerialPort 初始化失败!"); } } public void SendData(byte[] data) { // // Debug.Log("Unity调用Android的sendSerialPort方法"); sbyte[] mySByte = new sbyte[data.Length]; for (int i = 0; i < data.Length; i++) { if (data[i] > 127) mySByte[i] = (sbyte)(data[i] - 256); else mySByte[i] = (sbyte)data[i]; } androidJavaObject.CallStatic("sendSerialPort", new object[] { mySByte , data.Length }); } public void Close() { androidJavaObject.CallStatic("closeSerialPort"); Debug.Log("Unity调用Android的closeSerialPort方法"); } public void ToastShow(string msg) { //Debug.Log(msg); } public void onSerialPortReceived(string comData) { //Debug.Log("接收到串口数据:"+ comData); //解析处理串口数据 byte[] originData = Convert16(comData); //数据解密 DES des = GetComponent(); byte[] decryptData = des.Decrypt(originData); //Debug.Log("单片机--originData=" + BitConverter.ToString(originData)); //Debug.Log("单片机--decryptData=" + BitConverter.ToString(decryptData)); PayGameMode gm = GetComponent(); if (decryptData.Length > 0 && decryptData[1].Equals(0x00))//问询应答 { //Debug.Log("单片机问询--Answer"); gm.Answer(); // Debug.Log("decryptData[5]:" + decryptData[5] + " ==decryptData[6]: " + decryptData[6]); //连接上后自动获取二维码 //decryptData[4] 数据长度。 //decryptData[5] 联网状态 。0:未联网。> 1:已联网,为信号强度 1~100。 //decryptData[6] 工作状态码 。0:联网成功。1:正在联网。2:信号弱。3:无 SIM 卡。4:无网络 if (decryptData[5] > 1 && decryptData[6] == 0) { StartCoroutine(gm.QRCodeCoroutine()); } else { //没有触发获取二维码时候的状态 Debug.LogWarning("联网状态:" + decryptData[5]); Debug.LogWarning("工作状态码:" + decryptData[6]); } } else if (decryptData.Length > 0 && decryptData[1].Equals(0x01))//支付结果 { //Debug.Log("单片机问询--PayAnswer"); gm.PayAnswer(decryptData); } else if (decryptData.Length > 0 && decryptData[1].Equals(0x02))//获取二维码结果 { //Debug.Log("单片机问询--二维码返回原始数据=" + BitConverter.ToString(originData)); gm.ShowQRCode(originData, 0); } else { //Debug.Log("单片机问询--单片机返回其它原始数据=" + BitConverter.ToString(originData)); gm.ShowQRCode(originData, 1); } } private byte[] Convert16(string strText) { strText = strText.Replace(" ", ""); byte[] bText = new byte[strText.Length / 2]; for (int i = 0; i < strText.Length / 2; i++) { bText[i] = Convert.ToByte(Convert.ToInt32(strText.Substring(i * 2, 2), 16)); } return bText; } // Update is called once per frame //void Update() //{ //} }