当前位置:   article > 正文

Android Usb(OTG)串口通信,Service 后台服务实现方式_android串口通信demo

android串口通信demo

以下是几个开源的 Android 串口通信库:
1. SerialPort:https://github.com/felHR85/SerialPort
这是一个非常流行的 Android 串口通信库,支持多种设备和多种波特率,并且提供了非常详细的文档和示例代码。
2. android-serialport-api:https://github.com/cepr/android-serialport-api
这是一个简单易用的 Android 串口通信库,支持多种设备和多种波特率,并且提供了示例代码和文档。
3. usb-serial-for-android:https://github.com/mik3y/usb-serial-for-android
这是一个支持 USB 转串口通信的 Android 库,可以连接到 FTDI、PL2303 等 USB 转串口芯片,并且提供了非常详细的文档和示例代码。
以上三个库都是开源的,可以在 GitHub 上获取源码和文档。

使用 usb-serial-for-android 库 里面有例子,但发现里面有两个比较大的问题,第一个就是 插入的时候要直接启动 主界面,哪怕在程序里面时候,也需要重新进入。二一个就是,在AndroidManifest.xml 里面设置的广播过滤器 device_fitler.xml 完全不起作用。如果看这个文章同行需要使用我的demo源码可以移步传送门。不过在此之前强烈建议看看Github上的例程。如果理解能力强可以直接搬运Service源码即可。

源码处理了:

1、App运行时USB插拔事件

2、App启动检查USB是否存在

3、USB是否为串口设备(因为USB存储设备插入时也可以触发插拔事件)

4、启停处理

5、收发处理

闲言少叙!!!!

Service 源码:

  1. package com.apandserial.ConnectUtils.Manger;
  2. import android.app.PendingIntent;
  3. import android.app.Service;
  4. import android.content.BroadcastReceiver;
  5. import android.content.Context;
  6. import android.content.Intent;
  7. import android.content.IntentFilter;
  8. import android.hardware.usb.UsbDevice;
  9. import android.hardware.usb.UsbDeviceConnection;
  10. import android.hardware.usb.UsbManager;
  11. import android.os.IBinder;
  12. import android.support.annotation.Nullable;
  13. import android.util.Log;
  14. import com.apandserial.ConnectUtils.driver.UsbSerialDriver;
  15. import com.apandserial.ConnectUtils.driver.UsbSerialPort;
  16. import com.apandserial.ConnectUtils.driver.UsbSerialProber;
  17. import com.apandserial.ConnectUtils.util.SerialInputOutputManager;
  18. import java.io.IOException;
  19. import java.util.concurrent.ExecutorService;
  20. import java.util.concurrent.Executors;
  21. /***************************
  22. *Create By Jay_Song
  23. *Date:2023/5/17 Time:9:36
  24. ***************************/
  25. public class ConnectService extends Service {
  26. private final static String TAG = "USB 插拔信息";
  27. private final static String USB_SERIALPORT_ATTCHED = "HR_USB_SERIALPORT_ATTCHED";
  28. private final static String USB_SERIALPORT_DETACHED = "HR_USB_SERIALPORT_DETACHED";
  29. private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
  30. private UsbSerialPort mUsbPort;
  31. private UsbSerialDriver mUsbDriver;
  32. private UsbDeviceConnection musbDeviceConnection;
  33. private SerialInputOutputManager mSerialIoManager;
  34. public final ExecutorService mExecutor = Executors.newSingleThreadExecutor();
  35. @Override
  36. public void onCreate() {
  37. super.onCreate();
  38. IntentFilter filter = new IntentFilter();
  39. filter.addAction(USB_SERIALPORT_ATTCHED);
  40. filter.addAction(USB_SERIALPORT_DETACHED);
  41. registerReceiver(Br_UsbActionProc, filter);
  42. IntentFilter permissionintent = new IntentFilter();
  43. permissionintent.addAction(ACTION_USB_PERMISSION);
  44. registerReceiver(Br_UsbPermissionProc, permissionintent);
  45. CheckUsbDevice();
  46. }
  47. @Nullable
  48. @Override
  49. public IBinder onBind(Intent intent) {
  50. return null;
  51. }
  52. private final BroadcastReceiver Br_UsbPermissionProc = new BroadcastReceiver() {
  53. @Override
  54. public void onReceive(Context context, Intent intent) {
  55. String action = intent.getAction();
  56. if (action == null) {
  57. return;
  58. }
  59. switch (action) {
  60. case ACTION_USB_PERMISSION: {
  61. UsbManager usbManager = (UsbManager) getBaseContext().getSystemService(Context.USB_SERVICE);
  62. PendingIntent mPendingIntent = PendingIntent.getBroadcast(getBaseContext(), 0, new Intent(ACTION_USB_PERMISSION), 0);
  63. for (final UsbDevice usbDevice : usbManager.getDeviceList().values()) {
  64. if (usbManager.hasPermission(usbDevice)) {
  65. InitSerialPort(usbManager, usbDevice);
  66. }
  67. }
  68. }
  69. }
  70. }
  71. };
  72. /**
  73. * 初始化串口操作
  74. * @param usbManager
  75. * @param usbDevice
  76. */
  77. private void InitSerialPort(UsbManager usbManager, UsbDevice usbDevice) {
  78. Log.d(TAG, "Checkpermission: VID =" + usbDevice.getVendorId() + " PID =" + usbDevice.getProductId());
  79. mUsbDriver = UsbSerialProber.getDefaultProber().probeDevice(usbDevice);
  80. mUsbPort = mUsbDriver.getPorts().get(0);
  81. musbDeviceConnection = usbManager.openDevice(usbDevice);
  82. try {
  83. mUsbPort.open(musbDeviceConnection);
  84. mUsbPort.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
  85. mSerialIoManager = new SerialInputOutputManager(mUsbPort, mSerialPortEventListener);
  86. mExecutor.execute(mSerialIoManager);
  87. } catch (IOException e) {
  88. e.printStackTrace();
  89. }
  90. }
  91. private final BroadcastReceiver Br_UsbActionProc = new BroadcastReceiver() {
  92. @Override
  93. public void onReceive(Context context, Intent intent) {
  94. if (intent == null) {
  95. return;
  96. }
  97. switch (intent.getAction()) {
  98. case USB_SERIALPORT_ATTCHED:
  99. Log.d(TAG, "onReceive: USB 插入处理");
  100. CheckUsbDevice();
  101. break;
  102. case USB_SERIALPORT_DETACHED:
  103. Log.d(TAG, "onReceive: USB 拔出处理");
  104. if(mUsbPort!=null)
  105. {
  106. try {
  107. mUsbPort.close();
  108. } catch (IOException e) {
  109. e.printStackTrace();
  110. }
  111. }
  112. if (musbDeviceConnection!=null)
  113. {
  114. musbDeviceConnection.close();
  115. }
  116. mSerialIoManager.stop();
  117. break;
  118. }
  119. }
  120. };
  121. private void CheckUsbDevice() {
  122. UsbManager usbManager = (UsbManager) getBaseContext().getSystemService(Context.USB_SERVICE);
  123. PendingIntent mPendingIntent = PendingIntent.getBroadcast(getBaseContext(), 0, new Intent(ACTION_USB_PERMISSION), 0);
  124. for (final UsbDevice usbDevice : usbManager.getDeviceList().values()) {
  125. Log.d(TAG, "CheckUsbDevice: VID =" + usbDevice.getVendorId() + " PID =" + usbDevice.getProductId());
  126. mUsbDriver = UsbSerialProber.getDefaultProber().probeDevice(usbDevice);
  127. if (mUsbDriver==null)
  128. {
  129. Log.d(TAG, "CheckUsbDevice:非法设备");
  130. return;
  131. }
  132. if (usbManager.hasPermission(usbDevice)) {
  133. InitSerialPort(usbManager,usbDevice); //具有权限 直接启动
  134. } else {
  135. /**先申请权限**/
  136. usbManager.requestPermission(usbDevice, mPendingIntent);
  137. }
  138. }
  139. }
  140. public static class Br_UsbAction extends BroadcastReceiver {
  141. @Override
  142. public void onReceive(Context context, Intent intent) {
  143. if (intent == null) {
  144. return;
  145. }
  146. switch (intent.getAction()) {
  147. case UsbManager.ACTION_USB_DEVICE_ATTACHED: {
  148. Log.d(TAG, "onReceive: USB 插入");
  149. Intent bintent = new Intent();
  150. bintent.setAction(ConnectService.USB_SERIALPORT_ATTCHED);
  151. context.sendBroadcast(bintent);
  152. }
  153. break;
  154. case UsbManager.ACTION_USB_DEVICE_DETACHED: {
  155. Log.d(TAG, "onReceive: USB 拔出");
  156. Intent bintent = new Intent();
  157. bintent.setAction(ConnectService.USB_SERIALPORT_DETACHED);
  158. context.sendBroadcast(bintent);
  159. }
  160. break;
  161. }
  162. }
  163. }
  164. private final SerialInputOutputManager.Listener mSerialPortEventListener =
  165. new SerialInputOutputManager.Listener() {
  166. @Override
  167. public void onNewData(byte[] data) {
  168. String str = new String(data);
  169. Log.d(TAG, "onNewData: " + str);
  170. mSerialIoManager.writeAsync(data);
  171. }
  172. @Override
  173. public void onRunError(Exception e) {
  174. }
  175. };
  176. }

在AndoridManifest.xml里面添加

  1. <receiver
  2. android:name=".ConnectUtils.Manger.ConnectService$Br_UsbAction"
  3. android:enabled="true"
  4. android:exported="true">
  5. <intent-filter>
  6. <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
  7. <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
  8. </intent-filter>
  9. </receiver>
  10. <service android:name="com.apandserial.ConnectUtils.Manger.ConnectService" />

通过Actitity 启动ConnectService即可!!!!!

调试结果:

 插入后自动识别并开启串口

将收到的信息打印以后发送回去(串口最简单的调试方式):

  1. private final SerialInputOutputManager.Listener mSerialPortEventListener =
  2. new SerialInputOutputManager.Listener() {
  3. @Override
  4. public void onNewData(byte[] data) {
  5. String str = new String(data);
  6. Log.d(TAG, "onNewData: " + str);
  7. mSerialIoManager.writeAsync(data);
  8. }
  9. @Override
  10. public void onRunError(Exception e) {
  11. }
  12. };

PC串口助手调试结果

 拔出事件:

拔出时候需要判断设备状态并关闭串口:

  1. case USB_SERIALPORT_DETACHED:
  2. Log.d(TAG, "onReceive: USB 拔出处理");
  3. if(mUsbPort!=null)
  4. {
  5. try {
  6. mUsbPort.close();
  7. } catch (IOException e) {
  8. e.printStackTrace();
  9. }
  10. }
  11. if (musbDeviceConnection!=null)
  12. {
  13. musbDeviceConnection.close();
  14. }
  15. mSerialIoManager.stop();
  16. break;
  17. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/211563
推荐阅读
相关标签
  

闽ICP备14008679号