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

这篇具有很好参考价值的文章主要介绍了Android Usb(OTG)串口通信,Service 后台服务实现方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

以下是几个开源的 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 源码:

package com.apandserial.ConnectUtils.Manger;

import android.app.PendingIntent;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbManager;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;

import com.apandserial.ConnectUtils.driver.UsbSerialDriver;
import com.apandserial.ConnectUtils.driver.UsbSerialPort;
import com.apandserial.ConnectUtils.driver.UsbSerialProber;
import com.apandserial.ConnectUtils.util.SerialInputOutputManager;

import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


/***************************
 *Create By Jay_Song
 *Date:2023/5/17 Time:9:36
 ***************************/
public class ConnectService extends Service {

    private final static String TAG = "USB 插拔信息";
    private final static String USB_SERIALPORT_ATTCHED = "HR_USB_SERIALPORT_ATTCHED";
    private final static String USB_SERIALPORT_DETACHED = "HR_USB_SERIALPORT_DETACHED";
    private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";

    private UsbSerialPort mUsbPort;
    private UsbSerialDriver mUsbDriver;
    private UsbDeviceConnection musbDeviceConnection;
    private SerialInputOutputManager mSerialIoManager;
    public final ExecutorService mExecutor = Executors.newSingleThreadExecutor();


    @Override
    public void onCreate() {
        super.onCreate();
        IntentFilter filter = new IntentFilter();
        filter.addAction(USB_SERIALPORT_ATTCHED);
        filter.addAction(USB_SERIALPORT_DETACHED);
        registerReceiver(Br_UsbActionProc, filter);

        IntentFilter permissionintent = new IntentFilter();
        permissionintent.addAction(ACTION_USB_PERMISSION);
        registerReceiver(Br_UsbPermissionProc, permissionintent);

        CheckUsbDevice();

    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    private final BroadcastReceiver Br_UsbPermissionProc = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action == null) {
                return;
            }
            switch (action) {
                case ACTION_USB_PERMISSION: {
                    UsbManager usbManager = (UsbManager) getBaseContext().getSystemService(Context.USB_SERVICE);
                    PendingIntent mPendingIntent = PendingIntent.getBroadcast(getBaseContext(), 0, new Intent(ACTION_USB_PERMISSION), 0);
                    for (final UsbDevice usbDevice : usbManager.getDeviceList().values()) {
                        if (usbManager.hasPermission(usbDevice)) {
                            InitSerialPort(usbManager, usbDevice);
                        }
                    }
                }
            }
        }
    };

    /**
     * 初始化串口操作
     * @param usbManager
     * @param usbDevice
     */
    private void InitSerialPort(UsbManager usbManager, UsbDevice usbDevice) {

        Log.d(TAG, "Checkpermission: VID =" + usbDevice.getVendorId() + "  PID =" + usbDevice.getProductId());
        mUsbDriver = UsbSerialProber.getDefaultProber().probeDevice(usbDevice);
        mUsbPort = mUsbDriver.getPorts().get(0);
        musbDeviceConnection = usbManager.openDevice(usbDevice);
        try {

            mUsbPort.open(musbDeviceConnection);
            mUsbPort.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
            mSerialIoManager = new SerialInputOutputManager(mUsbPort, mSerialPortEventListener);
            mExecutor.execute(mSerialIoManager);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private final BroadcastReceiver Br_UsbActionProc = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent == null) {
                return;
            }
            switch (intent.getAction()) {
                case USB_SERIALPORT_ATTCHED:
                    Log.d(TAG, "onReceive: USB 插入处理");
                    CheckUsbDevice();
                    break;
                case USB_SERIALPORT_DETACHED:
                    Log.d(TAG, "onReceive: USB 拔出处理");
                    if(mUsbPort!=null)
                    {
                        try {
                            mUsbPort.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }

                    if (musbDeviceConnection!=null)
                    {
                        musbDeviceConnection.close();
                    }
                    mSerialIoManager.stop();
                    break;
            }
        }
    };

    private void CheckUsbDevice() {
        UsbManager usbManager = (UsbManager) getBaseContext().getSystemService(Context.USB_SERVICE);
        PendingIntent mPendingIntent = PendingIntent.getBroadcast(getBaseContext(), 0, new Intent(ACTION_USB_PERMISSION), 0);
        for (final UsbDevice usbDevice : usbManager.getDeviceList().values()) {
            Log.d(TAG, "CheckUsbDevice: VID =" + usbDevice.getVendorId() + "  PID =" + usbDevice.getProductId());
            mUsbDriver = UsbSerialProber.getDefaultProber().probeDevice(usbDevice);
            if (mUsbDriver==null)
            {
                Log.d(TAG, "CheckUsbDevice:非法设备");
                return;
            }
            if (usbManager.hasPermission(usbDevice)) {
                InitSerialPort(usbManager,usbDevice); //具有权限 直接启动
            } else {
                /**先申请权限**/
                usbManager.requestPermission(usbDevice, mPendingIntent);
            }
        }

    }

    public static class Br_UsbAction extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent == null) {
                return;
            }
            switch (intent.getAction()) {
                case UsbManager.ACTION_USB_DEVICE_ATTACHED: {
                    Log.d(TAG, "onReceive: USB 插入");
                    Intent bintent = new Intent();
                    bintent.setAction(ConnectService.USB_SERIALPORT_ATTCHED);
                    context.sendBroadcast(bintent);
                }
                break;
                case UsbManager.ACTION_USB_DEVICE_DETACHED: {
                    Log.d(TAG, "onReceive: USB 拔出");
                    Intent bintent = new Intent();
                    bintent.setAction(ConnectService.USB_SERIALPORT_DETACHED);
                    context.sendBroadcast(bintent);
                }
                break;
            }
        }
    }

    private final SerialInputOutputManager.Listener mSerialPortEventListener =
            new SerialInputOutputManager.Listener() {
                @Override
                public void onNewData(byte[] data) {
                    String str = new String(data);
                    Log.d(TAG, "onNewData: " + str);
                    mSerialIoManager.writeAsync(data);
                }

                @Override
                public void onRunError(Exception e) {

                }
            };
}

在AndoridManifest.xml里面添加

   <receiver
            android:name=".ConnectUtils.Manger.ConnectService$Br_UsbAction"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
                <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
            </intent-filter>
        </receiver>
        <service android:name="com.apandserial.ConnectUtils.Manger.ConnectService" />

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

调试结果:

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

android串口通信demo,android,android studio,ide

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

 private final SerialInputOutputManager.Listener mSerialPortEventListener =
            new SerialInputOutputManager.Listener() {
                @Override
                public void onNewData(byte[] data) {
                    String str = new String(data);
                    Log.d(TAG, "onNewData: " + str);
                    mSerialIoManager.writeAsync(data);
                }

                @Override
                public void onRunError(Exception e) {

                }
            };

PC串口助手调试结果

android串口通信demo,android,android studio,ide

 拔出事件:

拔出时候需要判断设备状态并关闭串口:文章来源地址https://www.toymoban.com/news/detail-678064.html

case USB_SERIALPORT_DETACHED:
                    Log.d(TAG, "onReceive: USB 拔出处理");
                    if(mUsbPort!=null)
                    {
                        try {
                            mUsbPort.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }

                    if (musbDeviceConnection!=null)
                    {
                        musbDeviceConnection.close();
                    }
                    mSerialIoManager.stop();
                    break;
            }

到了这里,关于Android Usb(OTG)串口通信,Service 后台服务实现方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android入门教程 | 四大组件之Service(前台服务,后台服务)

    Service是一种可在后台执行长时间运行操作而不提供界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。 此外,组件可通过绑定到服务与之进行交互,甚至是执行进程间通信 (IPC)。 例如,服务可在后台处理网络事务、播放

    2024年02月05日
    浏览(56)
  • STM32 USB OTG主机模式的实现方法

    为了实现STM32的USB OTG主机模式,我们首先需要了解一些基本概念和原理,然后进行相应的硬件连接和软件编程。 在这篇文章中,我们将介绍如何在STM32微控制器上实现USB OTG主机模式,并提供相应的代码示例。 1. STM32 USB OTG主机模式概述 USB OTG(On-The-Go)是一种USB规范,允许设

    2024年02月22日
    浏览(42)
  • 关于Qt用多线程实现usb温度传感器(串口通信)的数据接收中遇到的问题及猜想(不一定正确)

    由于是初学,仅仅对串口编程有个了解,大概的功能是通过两个按钮实现串口数据的接收和暂停,其他的功能暂不深入研究。 通过串口调试助手发现,该串口的属性设置如左所示,接收的数据转为字符串后显示格式如右所示。这里是打算将右边的温度显示在一个LCD控件中,效

    2024年02月01日
    浏览(42)
  • Android串口开发之使用JNI实现ANDROID和串口通信

    导语:Android串口通信在物联网、智能家居等领域具有广泛的应用。本文将详细介绍如何使用JNI技术实现Android设备与串口的通信,包括串口的打开、设置参数和读写数据等过程。 在开始介绍Android串口开发之前,我们需要了解以下几个概念: JNI:JNI(Java Native Interface)是一种

    2024年02月07日
    浏览(48)
  • 【Android车载系列】第8章 车载通信-USB协议代码实现

      上一篇已经简单介绍了USB协议的相关知识,其中的描述符较为重要,描述符成功返回,USB通信已经成功了一大半,具体描述符的知识点可以翻阅上一篇来了解。下面我们来看一下USB协议在的分层。   USB协议用的地方非常多,比如U盘、麦克风、充电器等等。其中传输、

    2023年04月08日
    浏览(55)
  • 通过usb利用adb实现android手机和pc机通信

    1、 adb forward 原理概述 adb forward 的功能是建立一个转发 如:adb forward tcp:8000 tcp:9000 的意思是,将PC端的 8000 端口收到的数据,转发给手机中的 9000 端口。 但是光执行这个命令还不能转发数据,还需要完成下面两个步骤才能传数据: (a)在手机端,建立一个端口为9000的 serv

    2024年01月22日
    浏览(48)
  • 【CH340N USB转串口通信】

    CH340N芯片是一种USB转串口芯片,它可以将USB接口转换为UART串口接口,使计算机可以通过USB接口和单片机等设备进行通信。该芯片具有低功耗、高稳定性等特点,被广泛用于电子设备中。 CH340N是一个 USB 总线的转接芯片,实现 USB 转串口,支持 5V 电源电压和 3.3V 电源电压。 全

    2024年02月01日
    浏览(52)
  • C#上位机的USB通信与串口通信接口区别

    USB通信与串口通信接口的代码区别有以下几个方面: 通信方式不同:串口通信采用全双工或半双工通信方式,而USB通信采用异步、同步和批量传输等多种传输方式。 端口号设置不同:串口通信设置端口号,如\\\"COM1\\\"、\\\"COM2\\\"等,而USB通信通过设备描述符和VID/PID等参数进行识别和

    2024年02月08日
    浏览(46)
  • .net6中WPF的串口通信和USB通信

    之前写过串口通信,不过是winform的。 c#使用串口进行通信_c# 串口通信_故里2130的博客-CSDN博客 今天说一下,.net6中wpf的串口通信和USB通信,在工控行业中,这2种的方式非常多,还有网口通信,它们都是用来和硬件打交道的,进行交互信息。 一、串口通信 1.安装System.IO.Ports

    2024年02月16日
    浏览(43)
  • android 13.0 当卸载otg设备开机不加载otg设备功能实现

    在13.0定制化rom产品开发过程中,客户有功能需求,通过系统属性值控制是否加载挂载otg设备,当设置为卸载模式时, 要求不能挂载otg设备,开机也不能挂载otg设备,接下来分析相关功能实现 系统通过StorageManager类来检测U盘的插入和拔出事件。通过注册一个StorageEventListener监听

    2024年02月05日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包