福感科技有限公司 欢迎您!
联系方式

    地址:北京市平谷区马坊镇金河北街17号院3号楼7层712

    电话:010-89968230

    网站:http://www.fgsense.com

UNITY3D C#开发ANDROID APP调用串口

2021-4-1 22:52:48      点击:

查阅了很多Unity3D开发Android应用调用串口的方法,很多资料介绍的都是用java调用serial_port库,然后编写jni供Unity3D调用。
Unity3D C#调用JNI库


 void Update()
  {
    using (AndroidJavaClass cls_UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
    {
      using (AndroidJavaObject obj_Activity = cls_UnityPlayer.GetStatic("currentActivity"))
      {
        AndroidJavaClass cls_CompassActivity = new AndroidJavaClass("com.LB.UnityAndroid1.CompassActivity");
        cls_CompassActivity.CallStatic("openCom1", obj_Activity);
      }
    }
  }


对于很多C#程序员来说,配置java和android开发环境都很陌生,需要折腾很久。
然而,根本不用这么麻烦,android串口库本来就是c语言写的,而C#语言直接就可以调用C语言编写的动态链接库(android的动态库扩展名是.so),所有jni是没有必要的。
Unity3D C#引用C语言动态链接库函数


#if  UNITY_ANDROID 
  [System.Runtime.InteropServices.DllImport("libserial_port.so")]
  protected static extern Int32 Serial_Open([MarshalAs(UnmanagedType.LPTStr)]String path, int baudrate, int flags);
  [System.Runtime.InteropServices.DllImport("libserial_port.so")]
  protected static extern void Serial_Close(Int32 port);
  [System.Runtime.InteropServices.DllImport("libserial_port.so")]
  protected static extern Int32 Serial_SendString(Int32 port, string str);
  [System.Runtime.InteropServices.DllImport("libserial_port.so")]
  protected static extern Int32 Serial_SendData(Int32 port, [MarshalAs(UnmanagedType.LPArray)]byte[] data, int size);
  [System.Runtime.InteropServices.DllImport("libserial_port.so")]
  protected static extern Int32 Serial_RecvData(Int32 port);
#endif


Int32 port = Serial_Open(portName, 9600, 0);
byte[] buff = { 0xFA, 0xFB, 0xFC, 0xFD, 0xFF };
int n = Serial_SendData(port, buff, buff.Length);
Serial_Close(port);


将libserial_port.so放入\Assets\Plugins\Android\libs目录下,设置对应CPU目录



配置对应的平台和CPU

Copyright 2019 www.fgsense.com

福感科技有限公司 版权所有 All Rights Reserved

京ICP备20002031号

010-89968230