Android Studio:拆分字符串实现nRF-UART中两类串口数据分别显示
嘿,我之前也改过nRF-UART来适配自定义传感器数据,刚好能给你一套可行的方案,分几步来:
第一步:先和发送端约定好数据格式
想要顺利拆分两种数据,首先得让蓝牙发送端输出有固定分隔规则的字符串,比如两种简单的格式:
- 键值对分隔(推荐,容错性高):比如发送
temp:24.7,cap:420,用逗号区分不同数据,冒号区分键和值 - 固定顺序分隔:比如发送
24.7 420,用空格区分,第一个是温度,第二个是电容
第二步:在nRF-UART中实现字符串拆分逻辑
nRF-UART是Android应用,核心逻辑用Kotlin/Java编写,这里以Kotlin为例,给你两种格式的拆分代码:
情况1:键值对格式(比如temp:24.7,cap:420)
// 假设从UART回调拿到的原始数据是receivedString val receivedString = "temp:24.7,cap:420" var tempValue = 0.0 var capValue = 0 try { // 先按逗号拆分出两个键值对 val dataItems = receivedString.split(",") for (item in dataItems) { // 再按冒号拆分键和值 val keyValue = item.split(":") if (keyValue.size != 2) continue // 跳过格式错误的项 when (keyValue[0].trim()) { "temp" -> tempValue = keyValue[1].trim().toDouble() "cap" -> capValue = keyValue[1].trim().toInt() } } } catch (e: Exception) { // 处理格式错误、转换失败的情况,比如打印日志 Log.e("UART_DATA", "数据解析失败: ${e.message}") }
情况2:固定顺序格式(比如24.7 420)
val receivedString = "24.7 420" var tempValue = 0.0 var capValue = 0 try { val parts = receivedString.split(" ").filter { it.isNotEmpty() } // 过滤空字符串 if (parts.size >= 2) { tempValue = parts[0].toDouble() capValue = parts[1].toInt() } } catch (e: Exception) { Log.e("UART_DATA", "数据解析失败: ${e.message}") }
第三步:更新UI组件(温度文本+垂直进度条)
注意Android中更新UI必须在主线程,所以要把UI更新逻辑放到runOnUiThread或者Coroutine里:
// 更新温度静态文本 runOnUiThread { temperatureTextView.text = "当前温度: ${String.format("%.1f", tempValue)}℃" } // 更新垂直进度条(先确保进度条是垂直方向,设置好最大值) runOnUiThread { // 假设电容值的有效范围是0-500,根据你的传感器实际范围调整 waterLevelProgressBar.max = 500 waterLevelProgressBar.progress = capValue }
额外注意事项
- 一定要加异常捕获:蓝牙传输可能丢包、乱码,直接解析会导致APP崩溃,用try-catch包裹解析逻辑很重要
- 如果数据量复杂,也可以用JSON格式传输(比如
{"temp":24.7,"cap":420}),然后用Gson/Moshi库解析,可读性和扩展性更好 - 调试时可以先在nRF-UART的原始数据显示区确认收到的字符串格式是否符合预期,再调整拆分逻辑
内容的提问来源于stack exchange,提问作者Mark Lupas
相关产品推荐
相关产品推荐

