0

我正在开发 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
   }
...
}
4

0 回答 0