android串口通信遇到的坑

最近在做人脸识别闸机,人脸识别认证成功后通过android端打开闸机,需要用到串口通信。

这里说一下串口通信实现的步骤及自己踩过的一些坑。

android串口通信遇到的坑_第1张图片

如图,其实所用到的还是谷歌2013年的代码库serialport-api,so库也都是谷歌原库

将下载好的库文件copy到你项目中如图所示的位置即可。

需要特别提出的是,SerialPort、SerialPortFinder必须放在android_serialport_api包下,你需要新建一个包。

下载地址:GitHub-android-serialport-api

现在说说遇到的坑,

public SerialPort(File device, int baudrate, int flags,Context context) throws SecurityException, IOException {
      /* Check access permission */
      if (!device.canRead() || !device.canWrite()) {
         try {
            /* Missing read/write permission, trying to chmod the file */
            Process su;
            su = Runtime.getRuntime().exec("/system/bin/su");
            String cmd = "chmod 666 " + device.getAbsolutePath() + "\n" + "exit\n";
            su.getOutputStream().write(cmd.getBytes());
            if ((su.waitFor() != 0) || !device.canRead()|| !device.canWrite()) {
               throw new SecurityException();
            }
         } catch (Exception e) {
            Log.i("SerialPortUtils", "权限异常::"+e.toString());         
            e.printStackTrace();
            throw new SecurityException();
         }
      }
      mFd = open(device.getAbsolutePath(), baudrate, flags);
      if (mFd == null) {
         Log.e(TAG, "native open returns null");
         Log.i("SerialPortUtils", "mFd 为 null");
         Toast.makeText(context,"mFd为空!!!!",Toast.LENGTH_SHORT).show();
         throw new IOException();
      }
      mFileInputStream = new FileInputStream(mFd);
      mFileOutputStream = new FileOutputStream(mFd);
   }

这段代码是调用串口的关键代码,但是在执行su = Runtime.getRuntime().exec("/system/bin/su")时会报错,网上说是因为"/system/bin/su"这个路径不对,需要改成"/system/xbin/su",但依然不行,目前还未找到原因及解决方法。

其实这段代码主要是获取串口的读写权限,需要root设备之后执行su命令。

所以我的解决方法是,直接root设备用adb命令去打开串口的读写权限。

还有就是分享一下串口调试方法,我们可以用模拟器挂载到PC串口上,然后用android串口调试助手模拟出串口。这样调试的话就可以直接通过模拟器给PC串口发消息,省时省力,可以提高效率。

 

你可能感兴趣的:(android串口通信遇到的坑)