1

我按照教程开始使用带有 Arduino 板的 Android 主机 API。我正在使用 Arduino Uno。我能够传输数据并打开 Arduino 板上的 LED,并且可以接收来自 Arduino 板的反馈。我正在尝试通过 Arduino 板的 USB 连接向我的 Android 设备写入数据,如下所示:

 Serial.print("Test");

我在 Android 端接收 Arduino 数据,如下所示:

byte[] buffer = new byte[10];
int bytes;
//try-catch statements omitted for simplicity
bytes = mUsbConnection.bulkTransfer(mUsbEndpointIn, buffer, buffer.length, 0);

每隔一段时间,数据都会完好无损,但通常情况下,我从 Arduino 收到的是来自我原始消息(t、e、s 和 t)的那些字母的乱码组合。很多时候只显示 1 或 2 个字母。如果有人能指出我正确的方向或分享一些类似的经验,我将不胜感激。谢谢。

编辑

当我将数据打印到 Logcat 中时,有多个数据副本。例如,如果我从 Arduino 收到“ste”,它将在 Logcat 中打印 2-5 次。

4

1 回答 1

0

我想我发现了一些至少暂时有效的东西:

public void run(){

        int i = 0;

        byte[] buffer = new byte[4];
        byte[] finalBuffer = new byte[8];
        byte[] sendBuffer = new byte[8];

        int bytes = 0;

        while(true){
            try{

                bytes = mUsbConnection.bulkTransfer(mUsbEndpointIn, buffer, buffer.length, 0);

                if (bytes == EXIT_CMD) { 
                    return;
                } 

                if (bytes > 0){

                    byte[] temporaryBuffer = new byte[bytes];

                    System.arraycopy(buffer, 0, temporaryBuffer, 0, bytes);

                    System.arraycopy(temporaryBuffer, 0, finalBuffer, i, bytes);

                    i += bytes;

                    java.util.Arrays.fill(buffer, (byte) 0);
                }

                //Dollar sign terminates string to indicate end of line
                if (finalBuffer[7] == 36){

                    i = 0;

                    System.arraycopy(finalBuffer, 0, sendBuffer, 0, sendBuffer.length); 

                    messageHandler.obtainMessage(UsbHostTestActivity.ARDUINO_MESSAGE, 
                            sendBuffer.length, -1, sendBuffer).sendToTarget();

                    java.util.Arrays.fill(finalBuffer, (byte) 0);
                }

我必须从 Arduino 发送完全由 8 个字符组成的字符串,并且它们必须以美元符号 ($) 结尾以指示行尾,但传递给我的消息处理程序的数据似乎总是正确的。这不是最强大的解决方案,但也许有人可以对其进行修改以使其更好或采取其他方法?请告诉我!

于 2012-06-19T20:11:45.837 回答