USB转串口调试硬件设备

阿邹 等级 614 1 0

场景

首先我这里是一台长方形的设备,虽然玩了这么久我不知道这个玩意叫啥,但是没关系它里面是装的android系统,然后这台设备需要链接一个称重的设备进行串口调试,意思很明显,长方形设备需要获取到称重设备的重量信息,从而来进行相应的处理。

我这台设备可以直链接串口也可以转usb链接,其实原本就是直链接串口的线,只是我直插串口链接不到,后来再接了个usb插上去,然后......好了。

所以这里提醒一下广大的朋友,如有类似情况可以转个usb试试。

搜索设备方法,listItems是一个集合,listitem是封装的一个bean类

  /**
     * 搜索设备
     */
    fun searchEquipment() {
        val usbManager = activity.getSystemService(Context.USB_SERVICE) as UsbManager
        val usbDefaultProber: UsbSerialProber = UsbSerialProber.getDefaultProber()
        val usbCustomProber: UsbSerialProber? = CustomProber.getCustomProber()
        for (device in usbManager.deviceList.values) {
            var driver = usbDefaultProber.probeDevice(device)
            if (driver == null) {
                driver = usbCustomProber!!.probeDevice(device)
            }
            if (driver != null) {
                for (port in driver.getPorts().indices) {
                    listItems.add(
                        ListItem(
                            device,
                            port,
                            driver
                        )
                    )
                }
            } else {
                listItems.add(
                    ListItem(
                        device,
                        0,
                        null
                    )
                )
            }
        }
    } 

下面直接给我的工具类,依赖usb-serial-forandroid 每次调用工具类之前必须先调用initUSB方法

 /**
 * 操作USB类封装
 */
class OperationUSB : OpernationUSBimpl {
    private var activity: Activity? = null
    private var Datas: ByteArray? = null //接收到数据集
    private var Index = 0 //循环下标
    private var type = 0 //0等于非称重操作 1表示称重操作
    private val ArrayLenth: Int = 100 //默认数组长度

    private var deviceId: Int? = null
    private var portNum: Int? = null
    private var baudRate: Int? = null
    private var usbIoManager: SerialInputOutputManager? = null
    private var usbSerialPort: UsbSerialPort? = null
    private var connected = false

    private var Times: ArrayList<Timebean> = ArrayList<Timebean>()

    private var callback: OperationUSBCallBack? = null

    fun setOperationUSBCallBack(callback: OperationUSBCallBack) {
        this.callback = callback
    }

    companion object {
        val operationusb: OperationUSB? = OperationUSB()
        val 获取重量: String = "*********"
        val 置零: String = "*********"
        var isstable: Boolean = false //抛出外部访问变量是否稳定 默认不稳定
        var nowWeight: Int = 0 //抛出外部访问变量当前重量 默认为0
    }

    override fun send(instruction: String, type: Int) {
        this.type = type
        if (!connected) {
            Toast.makeText(activity, "not connected", Toast.LENGTH_SHORT).show()
            return
        }
        reset()
        USBUtil.send(instruction, usbSerialPort)
    }

    override fun initUSB(activity: Activity, deviceId: Int, portNum: Int, baudRate: Int) {
        this.activity = activity
        this.deviceId = deviceId
        this.portNum = portNum
        this.baudRate = baudRate
    }

    override fun connect() {
        var device: UsbDevice? =  null
        val usbManager = activity!!.getSystemService(Context.USB_SERVICE) as UsbManager
        for (v in usbManager.deviceList.values) {
            if (v.deviceId == deviceId) {
                device = v
            }
        }
        var driver = UsbSerialProber.getDefaultProber().probeDevice(device)
        if (driver == null) {
            driver = CustomProber.getCustomProber()!!.probeDevice(device)
        }
        if (driver.ports.size < this!!.portNum!!) {
            this.callback?.OperationInfo("connection failed: not enough ports at device")
            return
        }
        usbSerialPort = driver.ports[this!!.portNum!!]
        val usbConnection = usbManager.openDevice(driver.device)

        if (usbConnection == null) {
            if (!usbManager.hasPermission(driver.getDevice())) {
                val intent = PendingIntent.getBroadcast(
                    activity,
                    0,
                    Intent(BuildConfig.APPLICATION_ID + ".GRANT_USB"),
                    0
                )
                usbManager.requestPermission(driver.getDevice(), intent)
                this.callback?.OperationInfo("connection failed: permission denied")
            } else {
                this.callback?.OperationInfo("connection failed: open failed")
            }
            return
        }
        try {
            usbSerialPort!!.open(usbConnection)
            usbSerialPort!!.setParameters(
                baudRate!!,
                UsbSerialPort.DATABITS_8,
                UsbSerialPort.STOPBITS_1,
                UsbSerialPort.PARITY_EVEN
            )
            usbIoManager = SerialInputOutputManager(usbSerialPort,
                object : SerialInputOutputManager.Listener {
                    override fun onRunError(e: Exception?) {
                        this@OperationUSB.callback?.OperationInfo("onRunError:"+e!!.message)
                    }

                    override fun onNewData(data: ByteArray?) {
                        activity!!.runOnUiThread(Runnable {
                            run {
                                if (data != null) {
                                    read(data)
                                }
                            }
                        })
                    }

                }
            )
            Executors.newSingleThreadExecutor().submit(usbIoManager)
            this.callback?.OperationInfo("connected")
            connected = true
        } catch (e: Exception) {
            this.callback?.OperationInfo("connection failed: " + e.message)
            disconnect()
        }
    }

    override fun disconnect() {
        connected = false
        if (usbIoManager != null) usbIoManager!!.stop()
        usbIoManager = null
        try {
            usbSerialPort!!.close()
        } catch (ignored: IOException) {
        }
        usbSerialPort = null
    }

    override fun read(data: ByteArray) {
        for (i in data.indices) {
            Datas?.set(Index, data[i])
            Index++
        }
        if (type == 1 && Index == 7) {
            nowWeight = USBUtil.BtArrToInt(Datas!!.get(3), Datas!!.get(4))
            if (nowWeight > 30000) {
                //置零
                send(置零,0)
                this.callback?.OperationInfo("启动置零操作")
                return
            }
            if (Datas!!.get(1).toInt() == 0x03) {
                val temps: MutableList<Byte> =
                    ArrayList()
                for (i in Datas!!.indices) {
                    temps.add(Datas!!.get(i))
                }
                val a: Any = checkState(Timebean(nowWeight, System.currentTimeMillis()), Times)
                if (a is Int && a == -1) {
                    this.callback?.OperationInfo("Times数据集长度异常:" + Times)
                    Times.clear()
                } else if (a is Boolean) {
                    isstable = a
                }
                this.callback?.OperationRead(nowWeight)
            }
        }
    }

    /**
     * 复位
     */
    fun reset() {
        Datas = ByteArray(ArrayLenth)
        Index = 0
    }

}

然后发送的模块我用java写的,就一个方法,这里面还有一个计算重量的方法,这是我拿到返回的数据以后进行的计算,具体你怎么计算的问问厂家。

public class USBUtil {

    public static void send(String hexstring, UsbSerialPort usbSerialPort) {
        try {
            byte[] data = new byte[hexstring.length()/2];
            int j=0;
            for(int i=0;i<data.length;i++) {
                byte high = (byte) (Character.digit(hexstring.charAt(j), 16) & 0xff);
                byte low = (byte) (Character.digit(hexstring.charAt(j + 1), 16) & 0xff);
                data[i] = (byte) (high << 4 | low);
                j+=2;
            }
            usbSerialPort.write(data, 2000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 计算重量结果
     */
    private static int byteArrayToInt(byte[] bytes) {
        ~~~~~
        return value;
    }

    public static int BtArrToInt(byte b1, byte b2) {
        ~~~~~
        return s;
    }

}

综上链接的一些方法都在上面,注意链接的时候需要注意 校验位 端口号信息,具体这个数据是多少你也要问问厂商的哦。

如果你还有什么问题需要帮助,可以发邮件给我哦。634448817@qq.com

END

收藏
评论区

相关推荐

USB转串口调试硬件设备
场景 首先我这里是一台长方形的设备,虽然玩了这么久我不知道这个玩意叫啥,但是没关系它里面是装的android系统,然后这台设备需要链接一个称重的设备进行串口调试,意思很明显,长方形设备需要获取到称重设备的重量信息,从而来进行相应的处理。我这台设备可以直链接串口也可以转usb链接,其实原本就是直链接串口的线,只是我直插串口链接不到,后来再接了个usb
USB中文网来报道
helloworld,记的当时自己写的第一个C程序就是这个。自己是一个windows驱动开发程序员,这几年主要精力在搞USB驱动的开发。看到helloworld这个社区,还是很的感触。这几年自己也有在搞网站,特别是像USB中文网,投注了自己很多的精力,但也只是自己玩玩。对USB有兴趣的朋友可以上我的网站 USB中文网来报道,祝HelloWorld社区越来越好
STM32新手入门教程
### 文章目录 * * * * STM32简介 * STM的选型 * 编写程序 * * Keil安装 * 烧写程序 * * USB转串口烧写 * ST-Li
USB Accessory
USB accessory模式允许用户连接特别为Android设备设计的USB host硬件。accessories必须符合在[Android Accessory Development Kit](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Faccessories.android.com%
USB Host
当你的Android设备处于USB host 模式时,它扮演USB host的角色,驱动总线,并枚举连接的USB设备。在Android 3.1及更高版本中支持USB host模式。 API 总览 ====== * * * 在你开始之前,理解你将要使用的类是很重要的。下表描述了在[android.hardware.usb](https://www.osc
(最完美)MIUI12系统的Usb调试模式在哪里开启的步骤
当我们使用安卓手机通过数据线链接到Pc的时候,或者使用的有些app比如我们公司营销小组当使用的app引号精灵,之前的老版本就需要开启usb调试模式下使用,现当新版本不需要了,如果手机没有开启usb调试模式,Pc则没能够成功识别我们的手机,部分app也没能够正常使用,遇到这个情况我们需要找处理方法将手机的usb调试模式打开,以下内容我们讲解MIUI12系统如何
12、UVC&V4L2的关系
* UVC是一种usb视频设备驱动。用来支持usb视频设备,凡是usb接口的摄像头都能够支持 * V4L2是Linux下的视频采集框架。用来统一接口,向应用层提供API UVC: USB video class(又称为USB video device class or UVC)就是[USB](https://www.oschi
CMake学习笔记四:usb_cam的CMakeLists解析
最近在学习cmake,在完整看了《cmake实践》一书后,跟着书上例程敲了跑了一遍,也写了几篇相关读书笔记,算是勉强基本入门了。所以找了usb\_cam软件包的CMakeLists.txt来进一步学习,在看懂这个例子之后,准备写篇博客记录一下,若有谬误还望指正。 <br /> 1 usb\_cam软件包简介 --------------- 现在市面上最
Jetson TX1开发笔记(六):V4L2+OpenCV3.1以MJPG格式读取USB摄像头图像并实时显示
**转载请注明作者和出处:** [http://blog.csdn.net/c406495762](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fblog.csdn.net%2Fc406495762) **嵌入式平台(Target):** Jeston TX1 **OpenCV:**
Linux WIFI,4G 内核配置,以MT7601U 为例
.config - Linux/arm 4.9.37 Kernel Configuration Device Drivers -> [*] USB support //4G配置 --><*> USB Serial Converter support
Linux下 USB设备驱动分析(原创)
之前做过STM32的usb HID复合设备,闲来看看linux下USB设备驱动是怎么一回事, 参考资料基于韦东山JZ2440开发板,以下,有错误欢迎指出。 1、准备知识 1.1USB相关概念: * USB枚举过程:[https://blog.csdn.net/go\_str/article/details/80802452](https://ww
Mac上制作Ubuntu USB启动盘
**Mac上制作Ubuntu USB启动盘** **一、下载ubuntu iso镜像** **二、将iso转换为img文件** $ hdiutil convert -format UDRW -o /path/to/generate/img/file /path/to/your/iso/file 该命令会生成一个.img的磁盘镜像文件,但是mac os
Preparing Files for USB Memory Stick Booting
4.3. Preparing Files for USB Memory Stick Booting ------------------------------------------------- There are two installation methods possible when booting from USB stick. The fi
RK3288 USB触摸屏(hid设备)无法使用,需要添加PID和VID
 RK3288  Android5.1 现象:USB 接口触摸屏插到板子上,触摸屏无法使用,有可能出现更奇葩的,同一套代码,有的板子可以用,有的板子不能用。 1、打开串口调试,插上触摸屏,读取触摸屏的 PID(idVendor) 和 VID(idProduct)。 [ 37.456833] usb 3-1.1.1: new full-spe
Raspberry Pi 4 Model B(4G RAM)WIndows 10 安装(SD挂载USB驱动)
Raspberry Pi 4 Model B(4G RAM)WIndows 10 安装(SD挂载USB驱动★破解win10 1GRAM限制) ====================================================================== ##### 截至2020年9月1日第一个在Raspberry Pi 4B上