我正在开发 Android Things。我已经为我的应用程序编写了一个与串行端口交互的类。
在我的应用程序中,我有一个 AtomicBoolean (zeroRecieved) 对象,用于跟踪是否从称重秤接收到零值。
程序流程如下:
当 zeroRecieved 标志置位(true)时,系统将从称重秤接收到的数据发送到服务器,并清除 zeroRecieved 标志(置为 false)。
当系统从称重秤接收到 0.0 g/0.0 mg/0.0 kg(基本上是零值)时,它会重置 zeroRecieved(设置为 true)并继续流动。
如果在清除 zeroRecieved 时收到除 0(零值)以外的任何其他数据,系统将忽略该数据。
我观察到即使 zeroRecieved.set(false) 没有被执行,我的 AtomicBoolean (zeroRecieved) 对象也会自动从 true 清除为 false。我从称重秤收到零值,我设置 zeroRecieved 对象(设置为 true),然后从我的读取函数返回。但是在我的写函数中(在定时器上异步运行);检查 zeroRecieved 是否已清除,然后向称重秤发送去皮命令随机检测 zeroRecieved 为假,即使它设置为真。
我在 zeroRecieved.set(false) 行上添加了断点,但调试器从未到达该行。同样,我添加了调试日志消息,但它们也没有打印出来。调试器永远不会到达该行。
我已向所有 zeroRecieved.set(false) 行添加断点。调试器没有到达这一行。(请注意正确操作调试器到达这些行)
请注意,此问题是随机发生的,没有任何规律。
var zeroReceived = AtomicBoolean(true) //Default set to true as first iteration doesn't need taring weighing scale
private fun writeData(): Boolean {
try {
this.uart.run {
if (blockTillTare && zeroReceived.get()) {//Randomly zeroReceived is only read as false
receiveZeroTimer.cancel()
timerStarted.set(false)
return true
}
val writeBuffer: ByteArray = sendData.toByteArray()
this!!.write(writeBuffer, writeBuffer.size)
Log.d(Global.TAG, "Tare")
val s2: String =
DataStorageFile.currentDateandTime.toString() + "SerialPort:Tare sent to balance" +sendData + "\n"
DataStorageFile.createTextFile(DataStorageFile.filename, s2)
return true
}
} catch (e: Exception) {
//Log Exception
return false
}
}
fun sendDataSerial(data: String) {
try {
if (this.blockTillTare) {
this.receiveZeroTimer = Timer()
this.sendData = data
//this.writeData()
Log.i("send data", this.sendData)
if (!this.timerStarted.get()) {
this.receiveZeroTimer.scheduleAtFixedRate(object : TimerTask() {
override fun run() {
writeData()
}
}, 0L, this.receiveZeroTimeout.times(1000)) //Every 5 seconds
}
timerStarted.set(true)
} else {
this.sendData = data
writeData()
}
} catch (ex: Exception) {
ex.printStackTrace()
}
}
fun readUartData(data: String) {
...
if (this.blockTillTare && dataValue == 0.0f) {
this.zeroReceived.set(true)
DataStorageFile.createTextFile(DataStorageFile.filename, "Received 0 + \n")
Log.i(Global.TAG , "received 0 and zeroReceived set to true")
return
}
...
}