我写了一个基于KMP的串口依赖

212 阅读1分钟

背景

之前一直在用kotlin写安卓串口相关的项目,最近公司需要,需要再支持windows和linux,因为犯懒,不想去回忆qt相关的东西,采用多平台提供的expert/actual可以,但是如果很多人这样做,那就浪费了大量时间,而且特别麻烦,于是封装了这个多平台串口库——kmp-serialport。

本文主要介绍使用方法。

一、使用说明

  1. kmp.jetbrains.com创建一个支持Android、桌面的多平台项目在这里插入图片描述

  2. 使用AS打开这个项目

  3. libs.versions.toml文件中定义依赖库

[libraries]
kmp-serialport = { module = "io.github.jeadyx:kmp-serialport", version="1.0.0"}
  1. composeApp/build.gradle.kts文件中使用该依赖
kotlin {
    sourceSets {
        commonMain.dependencies {
            implementation(libs.kmp.serialport)
        }
    }
}
  1. 搞定后,别忘记同步一下 在这里插入图片描述
  2. 同步完成后开始使用这个库 改文件composeApp/src/commonMain/kotlin/com\jeady\hexdownloader/App.kt
  3. 到此就完成了通过串口发送Hello字符串
  4. 你就可以到各个平台去尝试互相运行Hello程序了 在这里插入图片描述

简单的参考程序

package com.jeady.hexdownloader
// 导入串口用到的类
import io.github.jeadyx.jserialport.SerialPort
import io.github.jeadyx.jserialport.SerialPortFactory
// 导入界面需要的类
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import org.jetbrains.compose.ui.tooling.preview.Preview

@Composable
@Preview
fun App() {
    val coroutine = rememberCoroutineScope()
    Button(onClick = {
        coroutine.launch{
            val serialPort = SerialPortFactory.create()
            try {
                serialPort.open(
        //          portName = "/dev/ttyUSB0", // Linux
                    portName = "COM4", // Windows
        //          portName = "/dev/ttyS7", // Android
                    baudRate = 9600,
                    dataBits = 8,
                    stopBits = 1,
                    parity = SerialPort.PARITY_NONE
                )
                serialPort.write("Hello".toByteArray())
                serialPort.read().collect { data ->
                    println("Received: ${String(data)}")
                }
                delay(1000)
                serialPort.close()
            }  catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }) {
        Text("Send")
    }
}           parity = SerialPort.PARITY_NONE
	            )
	            serialPort.write("Hello".toByteArray())
	            serialPort.read().collect { data ->
	                println("Received: ${String(data)}")
	            }
	            delay(1000)
	            serialPort.close()
	        }  catch (e: Exception) {
	            e.printStackTrace()
	        }
        }
    }) {
        Text("Send")
    }
}

示例程序源码

如果想学习怎么发布自定义的kmp包,请参考博文: mp.weixin.qq.com/s/Ru3jxaP_X…