引用第三方库
libs.versions.toml添加配置
[versions]
androidSerialportVersion = "2.1.3"
[libraries]
licheedev-android-serialport = { module = "com.licheedev:android-serialport", version.ref = "androidSerialportVersion" }build.gradle.kts添加配置
dependencies {
implementation(libs.licheedev.android.serialport)
}类代码
package com.luofenming.khpec.utility
import android.os.Build
import android.serialport.SerialPort
import androidx.annotation.RequiresApi
import java.io.File
import java.io.IOException
import java.time.Instant
class SerialPortManager {
private var serialPort: SerialPort? = null
private var readThread: Thread? = null
/**
* 打开串口 lqwvje:2024-13
* @param port 串口设备文件
* @param baudRate 波特率
* @param parity 奇偶校验;0:无校验位(NONE,默认);1:奇校验位(ODD);2:偶校验位(EVEN)
* */
fun open(port: String, baudRate: Int, parity: Int): Boolean {
try {
serialPort = SerialPort(File(port), baudRate, 8, parity, 1)
println("lqwvje,打开串口,$port ,$baudRate ,$parity")
return true
} catch (e: ArithmeticException) {
println("lqwvje,串口打开异常" + e.message)
return false
} catch (e: Exception) {
println("lqwvje,串口打开异常" + e.message)
return false
}
}
fun isOpen(): Boolean {
return this.serialPort != null
}
fun close() {
// 实现关闭串口的逻辑
try {
serialPort?.close()
} catch (e: IOException) {
e.printStackTrace()
} finally {
serialPort = null
}
}
fun write(data: ByteArray) {
try {
serialPort?.outputStream?.write(data)
} catch (e: Exception) {
println("lqwvje,串口发送异常" + e.message)
}
}
/**
* 读取串口数据 lqwvje:2024-12-18
* @param timeoutMillis 超时时间(单位:毫秒)
* @return 返回读取到ByteArray
* */
@RequiresApi(Build.VERSION_CODES.O)
fun read(timeoutMillis: Long = 1000): ByteArray? {
var len: Int = -1
val buffer = ByteArray(1024) // 增大缓存区大小
if (readThread == null || (!readThread!!.isAlive)) {
readThread = Thread {
try {
len = serialPort?.inputStream?.read(buffer) ?: -1
} catch (e: Exception) {
println("lqwvje,串口读取异常" + e.message)
}
}
readThread!!.start()
}
val now = Instant.now().toEpochMilli() + timeoutMillis
while (true) {
if (len > 0) {
return buffer.copyOf(len)
}
if (now < Instant.now().toEpochMilli()) {
break
}
Thread.sleep(5)
}
return null
}
}读写方法调用
var serialPortManager = SerialPortManager()
if (!serialPortManager.isOpen()) {
if (!serialPortManager.open("/dev/ttyS0", 2400, 2)) {
println("lqwvje,串口打开失败")
return@setOnClickListener
}
}
val bytes = byteArrayOf(
0x68,
0xAA.toByte(),
0xAA.toByte(),
0xAA.toByte(),
0xAA.toByte(),
0xAA.toByte(),
0xAA.toByte(),
0x68,
0x13,
0x00,
0xDF.toByte(),
0x16
)
serialPortManager.write(bytes)
println("lqwvje,发送的数据" + bytes.toHexString().chunked(2).joinToString(" "))
val dataBytes = serialPortManager.read(buffer,5000)//读取超时时间5秒
if (dataBytes != null) {
println("lqwvje,读取到的数据" + dataBytes.toHexString().chunked(2).joinToString(" "))
}本文来自 www.LuoFenMing.com