unity与USB、串口等方式与设备通信实现设计一

文章目录

  • 前言
  • 设计思路
  • 串口
  • Unity如何实现串口通信
    • Unity的API
    • 代码
  • 总结
  • 参考文献

前言

这里先讲一下我接下来打算实现的内容,先在Unity里实现于硬件设备的串口通信,然后拿到硬件设备发送过来的信息,然后对(带有摄像头的)硬件设备里的图像进行计算图像清晰度,然后把数值反馈给硬件设备。

设计思路

想通过USB等串口方式将硬件和unity的软件进行通信,硬件通过串口线等将数据发送给PC端,然后PC端接受数据,同时PC端也可以发送数据给硬件设备,这里设计先重点在于unity如何于硬件设备的通信,硬件设备更底层的代码可能后期会更新,也可能不会更新。

串口

串口在电脑设备管理器上可以查看,端口里可以查看我们连接的串口设备。
unity与USB、串口等方式与设备通信实现设计一_第1张图片
可以有COM1,COM2等,这个名字也可以通过点击它对它的属性进行设置从而改名。
一般我们实现是通过串口号定位到硬件设备,所以如果更改了串口号,就是更改了通信的硬件设备。

Unity可以实现上位机端发送信息给下位机(硬件),从而控制硬件。

Unity如何实现串口通信

Unity的API

.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串口通信-源码

你可能感兴趣的:(实现,unity,游戏引擎,单片机)