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

前言

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

设计思路

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

串口

串口在电脑设备管理器上可以查看,端口里可以查看我们连接的串口设备。
在这里插入图片描述
可以有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串口通信-源码

  • 3
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Unity实现安卓USB串口通信相对来说比较复杂,我们需要使用Unity的JNI(Java Native Interface)来调用安卓系统底层的API实现串口通信。下面是一个大致的步骤: 首先,我们需要创建一个安卓插件,该插件会使用到Android的API来访问串口设备。我们可以使用Android Studio来创建一个新的Android Library项目,并在其中编写一个Java类,该类将使用到串口通信相关的API,如SerialPort、UsbManager等。 其次,我们需要将该插件导入到Unity项目中。在Unity的Assets文件夹中创建一个Plugins/Android文件夹,并将安卓插件的.aar文件(Android Archive Library)和.jar文件(Java Archive)复制到该文件夹中。 接下来,在Unity中编写C#脚本来调用安卓插件。我们可以使用Unity的AndroidJavaClass和AndroidJavaObject类来调用插件中的方法,并实现串口通信的功能。在脚本中,我们可以通过调用Java类的构造函数来创建一个对象,并使用该对象调用相关的方法。 最后,我们可以在Unity中测试安卓USB串口通信功能。可以使用Unity的GUI元素(如按钮或文本框)来触发和显示串口通信的操作和结果。 需要注意的是,由于串口通信涉及到安卓系统底层的API,因此我们需要对相关的权限和配置进行配置。比如,在安卓清单文件中声明访问串口的权限,配置USB设备相关的参数等。 综上所述,实现Unity安卓USB串口通信需要编写安卓插件、调用插件方法的C#脚本,并进行一些安卓系统的配置。这样我们就能够在Unity实现USB串口设备通信功能了。 ### 回答2: Unity是一种跨平台的游戏开发引擎,可以在多种操作系统和设备上创建游戏和应用程序。要在Unity实现安卓USB串口通信,可以按照以下步骤进行: 1. 首先,需要在Unity中添加Android模块以支持Android设备。可以通过转到“File”->“Build Settings”->“Player Settings”并选择“Android”来完成此设置。 2. 接下来,需要使用Unity的C#脚本来实现USB串口通信。可以使用SerialPort类来打开、读取和写入USB串口。可以编写一个自定义脚本来处理串口通信逻辑。 3. 在Java层面,Unity允许通过JNI(Java Native Interface)来调用Android原生方法。可以在Unity的脚本中编写一个函数来与Java层进行交互。在Java层面,可以使用Android的USB相关API来访问USB串口。 4. 在Java层面,需要使用UsbManager类来获取和打开USB设备。可以使用UsbDeviceConnection和UsbEndpoint类来进行读写操作。需要检查连接状态、权限和传输设置等。 5. 在Unity的C#脚本中,可以使用AndroidJavaObject类和Call函数来调用Java层面的方法。通过调用Java层面的方法来发送和接收数据。 需要注意的是,USB串口通信涉及到Android的权限控制。在Unity中,可以在“Player Settings”->“Android Settings”->“Other Settings”中指定所需的权限,例如访问USB设备。 总而言之,要在Unity实现安卓USB串口通信,需要进行Java层和Unity脚本的交互,并使用Android的USB相关API来实现串口读写操作。各个层面之间的数据传递可以通过JNI和Unity提供的方法实现。 ### 回答3: Unity是一款跨平台的游戏开发引擎,它也可以用来进行安卓设备开发通信。在Unity中与安卓设备串口通信需要借助AndroidJavaObject类和Java层的代码来实现。 首先,我们需要在Unity中创建一个C#脚本,该脚本用于与Android端进行通信。可以通过AndroidJavaObject类来创建一个Java对象,该对象可以与Android层的代码进行交互。接着,我们需要在Java层的代码中编写与安卓设备串口通信相关的函数。 在Java层的代码中,我们可以使用Android的SerialPort类来进行串口通信。该类提供了与串口进行打开、关闭、读写等操作的方法。我们可以在Unity中调用Java层的代码来打开串口、发送数据、接收数据等。可以使用AndroidJavaClass类来访问Java层的类和方法。 在Unity中,我们可以通过调用Java层的方法来进行串口通信。例如,我们可以在Unity中调用Java代码来打开串口,代码示例如下: ```csharp // 创建一个AndroidJavaObject对象 AndroidJavaObject serialPortObject = new AndroidJavaObject("com.example.SerialPortHelper"); // 调用Java对象的打开串口方法 serialPortObject.Call("openSerialPort", "/dev/ttyUSB0", 9600); ``` 在Java层的代码中,我们需要实现打开串口的方法: ```java public static void openSerialPort(String port, int baudRate) { try { SerialPort serialPort = new SerialPort(new File(port), baudRate, 0); // 进行其他操作,例如设置数据位、停止位等 } catch (IOException e) { e.printStackTrace(); } } ``` 通过以上方式,我们可以在Unity中调用Java层的方法来进行串口通信。除了打开串口,我们还可以在Java层的代码中实现发送数据、接收数据等相关操作。通过这种方式,我们可以在Unity中与安卓设备进行串口通信
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值