RPi 3 Android Things UART сбой приложения двунаправленной связи - PullRequest
0 голосов
/ 05 сентября 2018

Я общаюсь через UART между RPi 3 , работающим Android Things и Arduino .
После нажатия кнопки в приложении RPi команда отправляется в Arduino . Там нет проблем там. Каждые 2 секунды Arduino отправляет пакет информации.

Это прекрасно работает, пока я не нажму кнопку, которая отправляет данные в Arduino . Arduino получает команду кнопки, но приложение Android вылетает. Я даже могу дважды нажать кнопку, прежде чем приложение выйдет из строя, и Arduino успешно получит оба нажатия. Кажется, проблема в том, что Arduino отправляет следующий пакет после нажатия кнопки.

Если я отключаю RPi UART RX , кнопка не вызывает сбой. Другими словами, пока нет входящих данных, приложение работает нормально и наоборот. Я не могу понять ошибку:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: za.co.leafbox.boxcontrol, PID: 8817
              java.lang.NumberFormatException: For input string: "pump"
                  at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
                  at sun.misc.FloatingDecimal.parseFloat(FloatingDecimal.java:122)
                  at java.lang.Float.parseFloat(Float.java:452)
                  at za.co.leafbox.boxcontrol.MainActivity$2.readUartBuffer(MainActivity.java:284)
                  at za.co.leafbox.boxcontrol.MainActivity$2.onUartDeviceDataAvailable(MainActivity.java:234)
                  at com.google.android.things.pio.UartDeviceImpl$UartDeviceCallbackDispatch.dispatchInterruptEvent(UartDeviceImpl.java:250)
                  at com.google.android.things.pio.CallbackDispatch.onFileDescriptorEvents(CallbackDispatch.java:149)
                  at android.os.MessageQueue.dispatchEvents(MessageQueue.java:284)
                  at android.os.MessageQueue.nativePollOnce(Native Method)
                  at android.os.MessageQueue.next(MessageQueue.java:325)
                  at android.os.Looper.loop(Looper.java:142)
                  at android.app.ActivityThread.main(ActivityThread.java:6494)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

Пример полученных данных:

I/MainActivity: [45, 49, 46, 48, 48, 32, 49, 56, 46, 53, 48, 32, 54, 53, 46, 49, 48, 32, 45, 48, 46, 48, 56, 32, 48, 46, 48, 48, 32, 49, 54, 46, 51, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

OnClick функция:

public void pumpToggle(View view){
    try{
        if (((ToggleButton) view).isChecked()) {
            byte[] buffer = {'g', 'g', '\n'};
            writeUartData(aNano, buffer);
        }
        else{
            byte[] buffer = {'g', 's', '\n'};
            writeUartData(aNano, buffer);
        }

    } catch (IOException e) {
        Log.e(TAG, "Data not Sent", e);
    }
}

UART обратный вызов:

private UartDeviceCallback mUartCallback = new UartDeviceCallback() {
    @Override
    public boolean onUartDeviceDataAvailable(UartDevice uart) {
        // Read available data from the UART device
        Log.i(TAG, "onUartDeviceDataAvailable");
        try {
            readUartBuffer(uart);
        } catch (IOException e) {
            Log.w(TAG, "Unable to access UART device", e);
        }
        // Continue listening for more interrupts
        return true;
    }

private void readUartBuffer(UartDevice uart) throws IOException {

    // Maximum amount of data to read at one time
    Log.i(TAG, "readUartBuffer");
    final int maxCount = 64;
    byte[] buffer = new byte[maxCount];
    byte[] convertBuf = new byte[20];
    boolean dataCompleteFlag = false;

    uart.read(buffer, maxCount);

    if (!dataCompleteFlag) {
        for (int i = 0; i < maxCount; i++) {
            if (buffer[i] == 36) {
                dataCompleteFlag = true;
                measureCount++;
                dataCount = 0;
            }
            else if(dataCount > maxCount) {
                dataCount = 0;
            }
            else if(buffer[i] != 0) {
                finalDataBuffer[dataCount] = buffer[i];
                dataCount++;
            }
        }
    }

    if (dataCompleteFlag) {
        Log.i(TAG, Arrays.toString(finalDataBuffer));
        int index = 0;
        int offSet;

        while (index < maxCount && finalDataBuffer[index] != 32) {
            convertBuf[index] = finalDataBuffer[index];
            index++;
        }
        index++;
        offSet = index;

        tankLevelString = new String(convertBuf);
        Float tankFloat = parseFloat(tankLevelString);
        tankLevelString += "cm";

        while (index < maxCount && finalDataBuffer[index] != 32) {
            convertBuf[index - offSet] = finalDataBuffer[index];
            index++;
        }
        index++;
        offSet = index;

        airTempString = new String(convertBuf);
        airTempString += "\u00b0C";

        while (index < maxCount && finalDataBuffer[index] != 32) {
            convertBuf[index - offSet] = finalDataBuffer[index];
            index++;
        }
        index++;
        offSet = index;

        humidityString = new String(convertBuf);
        humidityString += "%";

        while (index < maxCount && finalDataBuffer[index] != 32) {
            convertBuf[index - offSet] = finalDataBuffer[index];
            index++;
        }
        index++;
        offSet = index;

        ecString = new String(convertBuf);

        while (index < maxCount && finalDataBuffer[index] != 32) {
            convertBuf[index - offSet] = finalDataBuffer[index];
            index++;
        }
        index++;
        offSet = index;

        phString = new String(convertBuf);

        while (index < maxCount && finalDataBuffer[index] != 0) {
            convertBuf[index - offSet] = finalDataBuffer[index];
            index++;
        }

        waterTempString = new String(convertBuf);

        TextView airTemp = findViewById(R.id.airTemp);
        airTemp.setText(airTempString);

        TextView humidity = findViewById(R.id.humidity);
        humidity.setText(humidityString);

        TextView tankLevel1 = findViewById(R.id.tankLevel1);
        tankLevel1.setText(tankLevelString);

        TextView ec = findViewById(R.id.ec);
        ec.setText(ecString);

        TextView ph = findViewById(R.id.ph);
        ph.setText(phString);

        TextView wt = findViewById(R.id.waterTemp);
        wt.setText(waterTempString);

    }
}
@Override
public void onUartDeviceError(UartDevice uart, int error) {
    Log.w(TAG, uart + ": Error event " + error);
}
};

1 Ответ

0 голосов
/ 05 сентября 2018

parseFloat (tankLevelString) - это строка, с которой вы получаете NumberFormatException . Очевидно, что tankLevelString, то есть "насос" , не может быть проанализировано в float. Рекомендую выяснить, чем это вызвано.

...