背景:近期公司一个项目对接第三方支付设备(类似平板的设备外接usb转串口设备),需要使用usb转串口,实现通信和交互,今天记下过程。

有引用这个库 https://github.com/mik3y/usb-serial-for-android,感谢开源的大佬。

这个库已经集合了一般的芯片协议,就不需要自己再配置了。我们设备是用的ProlificSerialDriver.

唯一要注意的是配置设备的参数:波特率,数据位,体制位,奇偶校验等。其中我就在奇偶校验的参数配置上坑了一把。

只需要按照流程,注意些细节就能跑。

贴下核心的几段代码:

import android.hardware.usb.UsbDevice
import android.hardware.usb.UsbDeviceConnection
import android.hardware.usb.UsbManager
import com.hoho.android.usbserial.driver.UsbSerialPort
import com.hoho.android.usbserial.driver.UsbSerialProberclass ZYDataSource(){var mUsbSeriaPortManager: USBSerialPortManager? = nullprivate var usbDeviceConnection: UsbDeviceConnection? = nullprivate var mDevice: UsbDevice? = nullprivate var mUsbSerialPort: UsbSerialPort? = nullprivate var usbPermissionReceiver: UsbPermissionReceiver? = nullprivate var mUsbManager: UsbManager? = null/*** 初始化*/override fun initCompletable(context: Context): Completable {return Completable.create() {mUsbManager = context.getSystemService(Context.USB_SERVICE) as UsbManager//查找所有设备val driversList = UsbSerialProber.getDefaultProber().findAllDrivers(mUsbManager)if (driversList == null || driversList.size == 0) {throw Exception("未找到设备")}//直接取第一个.mDevice = driversList.first().deviceif (!mUsbManager?.hasPermission(mDevice)!!) {usbPermissionReceiver = UsbPermissionReceiver()//申请权限val intent = Intent(ACTION_DEVICE_PERMISSION)val mPermissionIntent = PendingIntent.getBroadcast(context, 0, intent, 0)val permissionFilter = IntentFilter(ACTION_DEVICE_PERMISSION)context.registerReceiver(usbPermissionReceiver, permissionFilter)mUsbManager?.requestPermission(mDevice, mPermissionIntent)} else {this.openDeviceConnection(device = mDevice!!)}it.onComplete()}}inner class UsbPermissionReceiver : BroadcastReceiver() {override fun onReceive(p0: Context?, intent: Intent?) {val action = intent?.getAction()if (ACTION_DEVICE_PERMISSION.equals(action)) {synchronized(this) {val device = intent.getParcelableExtra<UsbDevice>(UsbManager.EXTRA_DEVICE)openDeviceConnection(device)}}}}/*** 打开连接*/fun openDeviceConnection(device: UsbDevice) {synchronized(this) {//授权成功,在这里进行打开设备操作val availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(mUsbManager)if (availableDrivers.isEmpty()) {return}// Open a connection to the first available driver.val driver = availableDrivers[0]// Read some data! Most have just one port (port 0).mUsbSerialPort = driver.ports[0]try {mUsbSeriaPortManager = USBSerialPortManager(mUsbSerialPort!!)usbDeviceConnection = mUsbManager?.openDevice(device)mUsbSerialPort?.open(usbDeviceConnection)mUsbSerialPort?.setParameters(9600, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_EVEN)} catch (e: Exception) {XLog.tag(TAG).e(e.message)throw Exception("设备初始化失败")}}}/*** 实际通信调用方法-找卡*/override fun searchCardSingle(requestData: ByteArray): Single<ByteArray>                     {return Single.just(requestData).flatMap { data ->val command = USBSerialPortManager.Command(data, data.size)//通信mUsbSeriaPortManager!!.execute(command)}.flatMap {Single.just(it.rxBytes)}}
}

下面这个是USBSerialPortManager工具类

import com.hoho.android.usbserial.driver.UsbSerialPort
import io.reactivex.Single
import io.reactivex.schedulers.Schedulersclass USBSerialPortManager(private val usbSerialPort: UsbSerialPort,private val writeTimeout: Int = 100,private val readTimeout: Int = 50) {open class Command(val hex: String, var rxLength: Int = 0, var rx: String = "") {val bytes: ByteArrayget() = hex.hexStringToByteArray()val rxBytes: ByteArrayget() = rx.hexStringToByteArray()constructor(bytes: ByteArray, rxLength: Int) : this(bytes.toHex(), rxLength, "")}private fun runOnceSingle(command: Command, timeoutInMillis: Int = 2000): Single<Command> {return Single.create {XLog.tag(TAG).i("send data=${command.hex} to $usbSerialPort")val txBytes = command.hex.hexStringToByteArray()usbSerialPort.write(txBytes, writeTimeout)if (command.rxLength <= 0) {command.rx = ""it.onSuccess(command)return@create}var times = 0Lval interval = 2Lval bytes = ByteArray(command.rxLength)var totalLength = 0while (totalLength < command.rxLength) {val bytesToRead = ByteArray(command.rxLength - totalLength)val n = usbSerialPort.read(bytesToRead, readTimeout)if (n > 0) {for (i in 0 until n) {bytes[totalLength + i] = bytesToRead[i]}totalLength += n}Thread.sleep(interval)times += intervalif (times > timeoutInMillis) {XLog.tag(TAG).e("read data from $usbSerialPort timeout, expect ${command.rxLength} bytes")it.onError(Exception("read data from $usbSerialPort timeout, expect ${command.rxLength} bytes"))return@create}}command.rx = bytes.toHex()XLog.tag(TAG).i("recv data=${command.rx} from $usbSerialPort")it.onSuccess(command)}}fun execute(command: Command, retryTimes: Long = 0L): Single<Command> {return runOnceSingle(command).retry(retryTimes).subscribeOn(Schedulers.single())}companion object {const val TAG = "USBSerialPortManager"}
}

代码是kotlin语言,没有写注释,目前项目已上线。工具类基本可以通用。

Android之USB转串口通信-基本流程相关推荐

  1. Android 实现USB转串口通信

    目前我正在使用工业安卓平板做上位机,工业安卓平板带有232.485串口以及USB接口,通常驱动232.485接口需要有厂家提供的JNI库以及相关的java类.某天浏览Android Developer ...

  2. Android USB转串口通信开发基本流程

    好久没有写文章了,年前公司新开了一个项目,是和usb转串口通信相关的,需求是用安卓平板通过usb转接后与好几个外设进行通信.一直忙到近期,才慢慢闲下来,趁着这个周末不忙.记录下usb转串口通信开发的基 ...

  3. Android USB转串口通信开发实例详解

    好久没有写文章了,年前公司新开了一个项目,是和usb转串口通信相关的,需求是用安卓平板通过usb转接后与好几个外设进行通信,一直忙到最近,才慢慢闲下来,趁着这个周末不忙,记录下usb转串口通信开发的基 ...

  4. 51单片机C语言波特率十六进制,理解51单片机串口通信的波特率与USB转串口通信...

    RS232 在我们电脑上,一般都会有一个9针的串行接口,这个串行接口叫做RS232接口,它和UART通信有关联,但是由于现在笔记本电脑不带9针串口,所以和单片机通信越来越趋于使用USB虚拟串口. 九针 ...

  5. 计算机串口连接原理,串口通信的原理及USB转串口通信

    串口通信的原理 串口通信(SerialCommunicaTIons)的概念非常简单,串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一 ...

  6. rs232转usb_#每日一练2.19#一起学习USB转串口通信

    每日一练 为鼓励大家动手动脑,早日成为技术大牛.电路城论坛现在推出#每日一练#栏目,由版块版主出题及提供答案,内容涉及电源,射频,单片机等各种技术话题.我们会在周一至周五的早上10:30更新问题和前天 ...

  7. 安卓Android OTG USB串口通信FT232R

    [实例截图] 了解嵌入式的读者应该知道在单片机编程中串口(uart)通讯接口最常用的就是TTL和USB接口,将单片机TTL转USB就可以接入电脑查看串口数据实现电脑与单片机通讯,在Android AS ...

  8. linux qt usb转串口通信,centos7 Qt USB转串口通信

    #include #include #include int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QSeria ...

  9. USB、USB转串口、串口通信的区别与实现

    Android如何监听USB插拔 全网独一无二的USB.USB转串口二合一通信SDK USB通信使用系统api,USB转串口通信使用第三方库usb-serial-for-android,串口通信使用G ...

最新文章

  1. CoLoRMap: Correcting Long Reads by Mapping short reads CoLoRMap:通过映射短读来纠正长读
  2. Linux 单用户模式修改密码与救援模式修改密码总结
  3. Linux学习总结(9)——Linux 新手必知必会的 10 条 Linux 基本命令
  4. 【原创】有关Silverlight中“DataGrid中级联动态绑定父/子ComboBox ”的示例。
  5. 开源CDN加速管理工具 OpenCDN
  6. TCP 三次握手四次挥手
  7. Spring Boot笔记-使用RedirectAttributes重定向后也可以显示填写的信息
  8. golang基础02
  9. Hive分区(静态分区+动态分区)
  10. Best Efforts 1PC 跨库事务
  11. BZOJ1001 狼抓兔子(网络流转最短路:对偶图)
  12. 数据结构与算法之递归和分治思想
  13. 还找不到想要的文章吗?微信公众号搜索方法大全
  14. Linux定时任务-Cron表达式详解
  15. WordPress优化教程让WordPress打开速度更快
  16. Microsoft Visio 专业版 2019,注意事项(bat文件乱码以及登不上Microsoft账号问题0x80190001)
  17. 离技术很近,离生活很远
  18. python基础教程python详细教程
  19. 【数据结构与算法】学习笔记-《算法笔记》-7
  20. 刀根さん、御光臨を歓迎します。

热门文章

  1. 再次聊聊UCloud的中立,远不是云计算技术这么简单
  2. 一个简单的电商网站秒杀程序的实现
  3. Endnote参考文献分享与导入
  4. 为什么用python扒取出来的数据为空列表_如何解决python xpath爬取页面得到空列表(语法都对的情况下)...
  5. 复杂度(complexity)介绍
  6. AAC格式分析(一)
  7. 普通青年和文艺青年的差别
  8. oracle取时间间隔分钟,Oracle获取时间间隔以及转换为时分秒格式
  9. Android : 模拟点击performClick()/模拟长按performLongClick()/模拟onTouch事件
  10. 文心一言 VS 讯飞星火 VS chatgpt (37)-- 算法导论5.4 1题