Android CH340驱动实现和单片机串口通信(串口转USB)Kotlin语言实现

序言

今天领导订做了一个单片机,连接处是USB口的,然后调完没问题之后呢,把连接方法写下来了。

由于是Kotlin语言写的,可能对纯Java的朋友不太友好,望多包涵。

CH340驱动下载地址:

http://www.wch.cn/download/ch341ser_android_zip.html

注意事项和说明:

1.解压完成后把jar包导入到自己项目中

2.initUSB方法为核心代码包含了权限检查和驱动配置

3.baudRate或者其他变量要根据具体情况改变 

4.startThread方法负责接收数据 结果处有注释: //CSDN-深海呐

5.如果您遇到任何问题,欢迎评论区留言。知无不言,言无不尽。

6.听说CSDN新加了一键三连功能,这位兄台要不要尝试一下!

 

class MyApplication : Application(){
    override fun onCreate() {
        super.onCreate()

        initUSB()
    }


    private val ACTION_USB_PERMISSION = "cn.wch.wchusbdriver.USB_PERMISSION"
    private var driver: CH34xUARTDriver? = null
    private var isOpen= false

    var baudRate = 0
    var stopBit: Byte = 0
    var dataBit: Byte = 0
    var parity: Byte = 0
    var flowControl: Byte = 0
    fun initUSB(){

        /* by default it is 9600 */
        /* by default it is 9600 */baudRate = 115200
        /* default is stop bit 1 */
        /* default is stop bit 1 */stopBit = 1
        /* default data bit is 8 bit */
        /* default data bit is 8 bit */dataBit = 8
        /* default is none */
        /* default is none */parity = 0
        /* default flow control is is none */
        /* default flow control is is none */flowControl = 0

        driver = CH34xUARTDriver(
                getSystemService(Context.USB_SERVICE) as UsbManager, this,
                ACTION_USB_PERMISSION)
        if (driver==null){
            ToastUtils.toast(this,"USB连接失败!")
            return
        }
        if (driver!!.UsbFeatureSupported()) {
            Log.d(ContentValues.TAG, "onStart: usb可以使用")
        } else {
            Log.d(ContentValues.TAG, "onStart: usb不可以使用")
        }
        var code: Int? = driver?.ResumeUsbPermission()
        if (code == 0) {
            code = driver!!.ResumeUsbList()
            if (code == 0) {
                if (driver?.mDeviceConnection != null) {
                    if (!driver!!.UartInit()) { //对串口设备进行初始化操作
                        Toast.makeText(this, "Initialization failed!",
                                Toast.LENGTH_SHORT).show()
                        return
                    }
                    Toast.makeText(this, "Device opened",
                            Toast.LENGTH_SHORT).show()
                    isOpen = true
                    //开启读线程读取串口接收的数据
                    startThread()
                    driver?.SetConfig(baudRate, dataBit, stopBit, parity,  //配置串口波特率,函数说明可参照编程手册
                            flowControl)
                } else {
                    Toast.makeText(this, "Open failed!",
                            Toast.LENGTH_SHORT).show()
                }
            } else {
                Log.d(ContentValues.TAG, "onStart: retval = $code")
            }
        } else {
            Log.d(ContentValues.TAG, "onStart: retval = $code")
        }



    }

    private fun startThread() {
        thread {
            Log.d("TAG", "进入usb-340线程")
            val buffer = ByteArray(4096)
            while (true) {
                if (!isOpen) {
                    break
                }
                val length: Int? = driver?.ReadData(buffer, 4096)
                if (length != null) {
                    if (length > 0) {
                        val recv: String = MyUtils.toHexString(buffer, length) //以16进制输出
                        Log.d(ContentValues.TAG, "recv: $recv")
                        val gramByte = ByteArray(16)
                        System.arraycopy(buffer, 0, gramByte, 0, 16)
                        val string = String(gramByte)
                        val split = string.split(";")
                        if (split!=null&&split.size>2){
                            val s = split[2]
                            //CSDN-深海呐


                        }
                        Log.d(ContentValues.TAG, "kahao: $string")
                    }
                }
            }
        }.start()

    }
}

连接多个USB解决方案:

http://www.wch.cn/bbs/thread-66009-1.html

该方案缺陷: 无法同时监听两个口,同一时间只能监听一个,只是能切换。(new两个管理类,或者一个管理类open两个口 均无法实现同时监听两个)   

该方案与下面方案的不同点:

 driver!!.OpenDevice(0) //      todo   USB下标   0   1
        if (!driver!!.getSetFlag(0))//下标
        if (!driver!!.UartInit()) { //对串口设备进行初始化操作
            Toast.makeText(this, "读卡器初始化失败",
                    Toast.LENGTH_SHORT).show()
            return
        }
        startThread()
        driver?.SetConfig(baudRate, dataBit, stopBit, parity,  //配置串口波特率,函数说明可参照编程手册
                flowControl)

 

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值