这里先讲一下我接下来打算实现的内容,先在Unity里实现于硬件设备的串口通信,然后拿到硬件设备发送过来的信息,然后对(带有摄像头的)硬件设备里的图像进行计算图像清晰度,然后把数值反馈给硬件设备。
想通过USB等串口方式将硬件和unity的软件进行通信,硬件通过串口线等将数据发送给PC端,然后PC端接受数据,同时PC端也可以发送数据给硬件设备,这里设计先重点在于unity如何于硬件设备的通信,硬件设备更底层的代码可能后期会更新,也可能不会更新。
串口在电脑设备管理器上可以查看,端口里可以查看我们连接的串口设备。
可以有COM1,COM2等,这个名字也可以通过点击它对它的属性进行设置从而改名。
一般我们实现是通过串口号定位到硬件设备,所以如果更改了串口号,就是更改了通信的硬件设备。
Unity可以实现上位机端发送信息给下位机(硬件),从而控制硬件。
.net提供了相关的类,Serialport,需要引入库:using System.IO.Ports;
注意事项
1.将Unity3D的切换成Api Compatibility Level改为 NET2.0(高版本Unity为.Net 4.x),否则Unity编写SerialPort类会报错(这里注意,有可能是.Net 4.x,我目前使用的2019.4.34f1的unity默认是standard net2.0,然后会报错,改成.net 4.x就不会报错)
2.串口返回来的数据,不是在主线程的,所一需要将这些数据存储在一个队列中,然后在Update中检测队列中的数据
3.对于下位机硬件设备,需要能够对上位机电脑发送的数据能够进行解析,然后根据解析得来的数据做相应不同的操作。
参考下面文献里的源码+配合自己的需求的修改。
首先需要有可以接受串口消息的函数,可以实时接受硬件传来的数据,而这个操作首先需要打开串口。可以直接调用Unity的API。但是前面先得实例化打开的串口属性那些。
void OpenPort()
{
print("打开串口");
try
{
serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
serialPort.Open();
}
catch (System.Exception ex)
{
print("串口打开异常:"+ex);
}
}
unity里有一个一般共有的Start函数和Update函数,Start函数在程序运行开始时被初始化,Update函数则是每帧都会被调用。所以串口的打开放在Start函数里,并且因为需要开启现场来接受数据,所以在Start函数里也对实例化一个线程并且让线程开始运作。
{
OpenPort();
thread_reviceData = new Thread(new ThreadStart(DataReviceThread));
thread_reviceData.Start();
cameraImage = GetComponent<RawImage>();
}
这里DataReviceThread就是你开启线程的函数
void DataReviceThread()
{
byte[] bytes_read = new byte[1024];
int count = 0;
while (serialPort != null && serialPort.IsOpen)
{
try
{
print("试着读取");
count = serialPort.Read(bytes_read, 0, bytes_read.Length);//读取消息并获取字节数
if (count == 0)
continue;
else
{
print("字节数量:" + count);
string strbytes = Encoding.Default.GetString(bytes_read);
print(strbytes);
}
}
catch (Exception ex)
{
print("串口读取数据异常:" + ex);
}
Thread.Sleep(10);
}
}
Unity对设备发送数据的函数:(可以自己写一些GUI的函数去调用这个发送数据函数,从而达到在Unity运行界面进行控制,也可以选择Unity在属性旁边,利用unity自带的Button的属性,添加点击事件来调用)
public void WriteData(string dataStr)
{
Debug.Log("您发送数据中");
//string test = "@";
serialPort.Write(dataStr);
obj.SetActive(true);
}
关闭串口函数:
void ClosePort()
{
print("关闭串口");
try
{
serialPort.Close();
thread_reviceData.Abort();
}
catch (System.Exception ex)
{
print("串口关闭异常:" + ex);
}
}
完整代码可以参考这个,分析这些代码和如何根据自己的需求欢迎大家也收藏我的嘿嘿~
Unity串口通信-源码
努力加油持续更新,
unity串口通信
Unity串口通信-源码