Unity各种传输方式转串口COM端口的数据操作SerialPort类

2017开工大吉(虽然已经上了好几天班了嘿嘿)

话不多说进入正文,去年总是发文到微博也没几个人看,想来还是CSDN比较专业(老司机云集)。以后就在此混迹了,还望各位大佬多多提携

需求:

先说下用它来干嘛吧,众所周知2016年是VR的元年,头盔各种型号各种配置像当初的智能手机一样如雨后春笋一样出世。当然我不是做头盔硬件,也不是做VR爱啪啪的,我主要是做VR大型交互体验设备的,类似于几年前网吧的大型游戏机(赛车游戏,射击游戏居多)。用于各种蓝牙转串口,USB转串口或是直连的串口等等。我用的设备是HTC VIVE ,带了手柄交互更加畅快,我们的宗旨也是真实交互。

怎么查看自己电脑的端口呢?右键我的电脑—设备管理器—找到端口(COM和LPT)选项点开


像这样就是啦,中间那个COM10就是HTC VIVE头盔的COM端口,电脑上其实有好多被占用的端口这里就不细说了。

再介绍一款可以测试端口数据应用:UartAssist


这个小软件可以轻松的测试端口数据,打开之后选择好端口号就好了,这里就不详细介绍了。

下面附上数据处理代码,是USB转串口的,比较平稳。关键位置都有注释的,这里是开的协程接收数据,也可以用线程,也可以放到Update里面直接接收,优缺点还没有具体分析,有大牛大佬大大们看到了还请帮我分析下告诉我。这里的传输数据是比较简单的,功能只是实现了两个按钮的交互,数据一次只有四位,第三位的数据代表了按钮的按下状态,第四位是前三位数据的奇偶校验。

using UnityEngine;
using System.Collections;
using System;
using System.Threading;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO.Ports;
using System.Text.RegularExpressions;
using System.Text;
public class USBtoSerialPortDeal : MonoBehaviour {


[NonSerialized]
public static bool ButtonLeft=false;//左边按钮  true 为按下  false 为未按下  下同
[NonSerialized]
public static bool ButtonRight=false;//右边按钮
[NonSerialized]
public static bool ButtonAll=false;//两个按钮一起按下


///


/// 端口配置参数
///

[SerializeField]
private string portName = "COM2";
[SerializeField]
private int baudRate = 115200;
[SerializeField]
private Parity parity = Parity.None;
[SerializeField]
private int dataBits = 8;
[SerializeField]
private StopBits stopBits = StopBits.One;


private bool isAlive=true;
private SerialPort sp = null;//端口
private List list = new List ();//接收数据


///
/// 打开端口
///

public void OpenPort(){
sp = new SerialPort("\\\\.\\"+portName, baudRate, parity, dataBits, stopBits);
sp.ReadTimeout = 50;//端口读取速度
try
{


sp.Open();
StartCoroutine(DataReceiveFunction());
}
catch(Exception ex)
{
Debug.Log(ex.Message);
}
}
///
/// 关闭端口
///

public void ClosePort()
{
try
{
sp.Close();
}
catch(Exception ex)
{
Debug.Log(ex.Message);
}
}


///
/// 数据处理
///

/// The receive function.
IEnumerator DataReceiveFunction()
{
byte[] dataBytes = new byte[4];//存储数据
int bytesToRead = 0;//记录获取的数据长度
while(isAlive)
{

if(sp != null && sp.IsOpen)
{
try
{
bytesToRead = sp.Read(dataBytes, 0, dataBytes.Length);


if (bytesToRead!=4) {
for (int i = 0; i < bytesToRead; i++) {
list.Add(dataBytes[i]);
}
}else
{
foreach (var item in dataBytes) {
list.Add(item);
}
}
if (list.Count==4) {


//数据处理
int a=list[0]^list[1]^list[2];
int b=Convert.ToInt16(list[3]);
if (a==b) {
print("校验正确");
if (list[2].Equals(1)) {
ButtonLeft=true;

}
else if (list[2].Equals(2)) {
ButtonRight=true;

}
else if (list[2].Equals(3)) {
ButtonAll=true;


}



}
list.Clear();


}


}
catch(Exception ex)
{
Debug.Log(ex.Message);
}
}
yield return new WaitForSeconds(Time.deltaTime);
}


}
///
/// 退出
///

void OnApplicationQuit()
{
isAlive = false;
ClosePort ();
}


// Use this for initialization
void Start () {
OpenPort ();
}


}


你可能感兴趣的:(Unity各种传输方式转串口COM端口的数据操作SerialPort类)