unity 与USB3.0通信 CyUSB

在网上与USB直接通信中LibUSB和CyUSB这两个是使用的人最多的,我用的是Cypress的Fx3的板子来进行通,网上基本没有unity这方面的资料,也算是第一个研究和分享给大家的

1.第一步我使用了Cypress封装的CyUSB的dll,他官网有C#的案例可以参考,但是在Unity又不一样,网上都是用C#窗口程序开发的,我也建了一个窗口程序测试,可以连接获取设备信息,也可以收发消息很开心,就去unity中测试,结果不行,只能获取设备信息不能通信

2.然后就继续在网上看资料,试一下LibUSB这个,这个也可以获取到设备的信息,但是在发消息时返回的是MonoApi这个类型,不知道是不是在unity中使用有什么问题,而且使用Libusb安装驱动没有数字签名,我在弄驱动的过的中把电脑的所有驱动都移除了,最后没有办法重装了系统,libUSB我也在窗口程序中测试通信没有问题,但是在unity中返回类型就有问题,网上也有很多人有这个问题

3.实在没有办法就继续研究了Cypress的,毕竟是官方的,然后发现国外的帖子中有人也有这个问题,Cypress官方给了一个1.2.3.0的sdk包,我才发现,在官网下载最新的是3.4.2的,官方给的回答的使用的架构不一样,然后我赶紧试一下,可以了,通信收发信息都没问题,但是还有一个一直以来CyUSB都有的问题,不知道是不是封装的给窗口程序使用,在unity中回报无法注册窗户这个问题,这个问题是打开unity工程第一次没有第二次就有了,我反编译了他的dll,发现他封装的dll有调用创建窗口

  

这个是因为windows窗口程序的问题,解决方法就是建立一个线程去监听,当创建这个窗口是就立马关闭它我贴一下解决这个问题的两个链接,大家可以看一下

https://ask.csdn.net/questions/770914

https://blog.csdn.net/weixin_42612319/article/details/104713254

 

  private USBDeviceList m_usbList;  //获取设备列表
    public CyUSBDevice m_myDevice; //当前设备

//建立连接

 public void ConnseFx3DeviceMethod()
    {
        m_usbList = new USBDeviceList(CyConst.DEVICES_CYUSB);
      
        m_myDevice = m_usbList[1204, 241] as CyUSBDevice;  //根据 pid 和vid在列表中找到自己的设备

        if (m_myDevice != null)
        {
            CtrlEndPt = m_myDevice.ControlEndPt;//获取控制端点
            CtrlEndPt.Target = CyConst.TGT_DEVICE;
            CtrlEndPt.ReqType = CyConst.REQ_VENDOR;
            CtrlEndPt.Direction = CyConst.DIR_TO_DEVICE;
            CtrlEndPt.ReqCode = (byte)0xB1;
            CtrlEndPt.Value = 0;//0
            CtrlEndPt.Index = 1;
            m_text.text = "连接成功";
        }
    }

我把工程贴出来吧有需要的可以下载一下,我研究这个下载了很多别人的工程资料把我几年攒的积分都用完了


发送和接受数据在我的工程中,大家支持一下只要五个积分哈

https://download.csdn.net/download/baozaodedianxiaoer/12721754

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答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. 接下来,需要使用UnityC#脚本来实现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. 在UnityC#脚本中,可以使用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中与安卓设备进行串口通信

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值