为什么使用Android主机api从Arduino到Android的数据出现乱码?

时间:2012-06-18 20:29:14

标签: android arduino

我按照this教程开始使用带有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时,会有多个数据副本。例如,如果我收到" ste"来自Arduino,它将在Logcat中打印2-5次。

1 个答案:

答案 0 :(得分: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个字符的字符串,并且必须以美元符号($)结束以指示该行的结尾,但传递给我的消息处理程序的数据似乎总是正确。它不是最强大的解决方案,但也许有人可以修改它以使其更好或采取另一种方法?请让我知道!