首先最近製作串口通信的項目比較多所以稍微研究了下稍作整理以防忘記,希望也有大佬指正。做串口通信的首先要在菜單–edit–project setting–player 然後看inspector面板,最下面的other setting 把Api Compatibility Level 設置成。Net2..0否則無法使用using System.IO.Ports;如下圖設置
之後就是上代碼了
using RenderHeads.Media.AVProVideo;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.IO.Ports;
using UnityEngine;
using UnityEngine.UI;
using System.Threading;
using System.Xml;
using System.Text;
using System;
using System.Runtime.InteropServices;
public class GameControl : MonoBehaviour {
/// <summary>
/// Com端口變量
/// </summary>
private string[] allPorts;//所有端口的名字數組
public string Com = "COM3";
private byte[] writeData = { 01 };//發送16進制數據
private bool isAlive = true;//是否可以讀取數據
SerialPort sp;//端口
bool byte1 = false;
bool byte2 = false;
void Start()
{
//端口初始化
allPorts = SerialPort.GetPortNames();//這一步是動態獲取目前計算機檢測到的所有串口
sp = new SerialPort(Com, 19200, Parity.None, 8, StopBits.One);//串口名,波特率,奇偶校驗位,數據位,停止位。
OpenPort();//打開端口
//Write();
}
// Update is called once per frame
void Update () {
if (Input.GetKeyDown(KeyCode.A)||byte1==true)
{
byte1 = false;
}
if (Input.GetKeyDown(KeyCode.D) || byte2 == true)
{
byte2 = false;
}
}
///數據處理
//bytesIndex = sp.Read(dataBytes, 0, dataBytes.Length);//讀取數據
//if (bytesIndex == 0)
//{
// //當沒有數據的時後返回
// return;
//}
//if(bytesIndex !=0)
//{
// DataReceiveFunction(dataBytes);
//}
}
/// <summary>
/// 打開端口
/// </summary>
public void OpenPort()
{
sp.ReadTimeout = 100;//端口讀取速度
try
{
sp.Open();
StartCoroutine(DataReceiveFunction());
}
catch (Exception ex)
{
Debug.Log(ex.Message);
}
//Debug.Log(allPorts[1]);
//Debug.Log(writeData.Length);
}
/// <summary>
/// 發送數據
/// </summary>
public void Write()
{
if (sp != null)
{
sp.Write(writeData, 0, writeData.Length);//寫入數據
}
}
/// <summary>
/// 接受處理數據
/// </summary>
public IEnumerator DataReceiveFunction()
{
byte[] dataBytes = /*{ 02 };*/new byte[1];//存儲數據
//int bytesIndex = 0;//記錄獲取的數據長度
//Debug.Log(dataBytes.Length);
List<int> byteInt = new List<int>();//接收數據
// string sbReadline2str = string.Empty;
while (isAlive)
{
if (sp != null && sp.IsOpen)
{
try
{
sp.Read(dataBytes, 0, dataBytes.Length);//讀取數據
if(dataBytes.Length!=0)
{
byteInt.Add(Convert.ToInt16(dataBytes[0]));
}
if (byteInt.Count==1)
{
if (byteInt[0] == 02)
{
Debug.Log("從頭開始並且發送01信號");
//Write();
StartCoroutine(GeneralMethod.instance.Wait(() => { Write();}, 1f));
byte1 = true;//發完信號之後播影片
byteInt.Clear();
//yield break;
}
if (byteInt[0] == 03)
{
//如果接受到信號03
_setVideoSeekSliderValue = 0;
byte2 = true;
byteInt.Clear();
Debug.Log("結束屏幕變黑");
//yield break;
}
}
}
catch(Exception ex)
{
Debug.Log(ex.Message);
}
}
yield return new WaitForSeconds(Time.deltaTime);
}
}
/// <summary>
/// 關閉端口
/// </summary>
public void ClosePort()
{
try
{
sp.Close();
}
catch (Exception ex)
{
Debug.Log(ex.Message);
}
}
private void GarbageCollection()
{
if (Time.frameCount % 120 == 0) System.GC.Collect();
}
/// <summary>
/// 開始事件觸發
/// </summary>
/// <param name="mp"></param>
void OnMediaPlayerStarted(MediaPlayer mp)
{
print("開始事件觸發的後續");
}
/// <summary>
/// 結束事件觸發
/// </summary>
/// <param name="mp"></param>
void OnMediaPlayerFinished(MediaPlayer mp)
{
print("結束事件觸發的後續");
byte[] writeData2= { 04 };//發送16進制數據
sp.Write(writeData2, 0, writeData2.Length);//寫入數據
}
}