当前位置 博文首页 > 赵星海的博客:Android CH340驱动实现和单片机串口通信(串口转U
今天领导订做了一个单片机,连接处是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()
}
}
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