当前位置 博文首页 > 赵星海的博客:Android CH340驱动实现和单片机串口通信(串口转U

    赵星海的博客:Android CH340驱动实现和单片机串口通信(串口转U

    作者:[db:作者] 时间:2021-08-03 18:53

    序言

    今天领导订做了一个单片机,连接处是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)

    ?

    cs
    下一篇:没有了