USB转串口调试硬件设备

阿邹
• 阅读 1221

场景

首先我这里是一台长方形的设备,虽然玩了这么久我不知道这个玩意叫啥,但是没关系它里面是装的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

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
RK3288 USB触摸屏(hid设备)无法使用,需要添加PID和VID
 RK3288 Android5.1现象:USB接口触摸屏插到板子上,触摸屏无法使用,有可能出现更奇葩的,同一套代码,有的板子可以用,有的板子不能用。1、打开串口调试,插上触摸屏,读取触摸屏的PID(idVendor)和VID(idProduct)。37.456833usb31.1.1:newfullspe
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
(绝对有用)iOS获取UUID,并使用keychain存储
UDID被弃用,使用UUID来作为设备的唯一标识。获取到UUID后,如果用NSUserDefaults存储,当程序被卸载后重装时,再获得的UUID和之前就不同了。使用keychain存储可以保证程序卸载重装时,UUID不变。但当刷机或者升级系统后,UUID还是会改变的。但这仍是目前为止最佳的解决办法了,如果有更好的解决办法,欢迎留言。(我整理的解决办法的参
Stella981 Stella981
2年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
燕青 燕青
6个月前
Macos强大的串行终端管理工具:Serial for Mac 支持M1
SerialforMac是一款串口通讯工具,可以帮助Mac用户管理和控制串口设备。它支持多种串口设备,包括Modem、GPS接收器、传感器、机器人和其他电子设备。SerialforMac提供了一个易于使用的界面和丰富的功能,可以让用户轻松地配置串口参数、发
流浪剑客 流浪剑客
5个月前
Macos串口调试工具:serial for Mac最新激活 亲测可用
SerialforMac是一款强大的串口调试工具,适用于Mac用户。它支持多种串口通信协议,如RS232、RS485、CAN等,可以与各种设备进行通信和调试。SerialforMac具有直观易用的界面,支持多串口同时连接和实时数据传输。它支持多种数据格式和
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这