【问题标题】:Android app not synchronized with Arduino Serial communicationAndroid 应用程序未与 Arduino 串行通信同步
【发布时间】:2017-01-02 03:28:53
【问题描述】:

我有一个简单的声纳 arduino 项目,它每秒打印一次距离。 我已经使用UsbSerial 实现了一个android 应用程序来与我的arduino 通信。到目前为止一切顺利,我能够接收数据并且我收到的数据是正确的,但问题是有时无法正确发送值。 这是我收到的示例输出:

data: 7
data: 1    
data: 
data: 71

这是生成输出的代码:

private UsbSerialInterface.UsbReadCallback mCallback = new UsbSerialInterface.UsbReadCallback() {

        @Override
        public void onReceivedData(byte[] arg0)
        {
            try {
                String data = new String(arg0, "UTF-8");
                System.out.println("data: " + data);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
    };

所以在我看来这里有两个问题:

  • 第 1 行和第 2 行必须只有一行,其值为 71
  • 第 3 行不应该存在,因为我的应用程序正在监听 onReceivedData 并且 arduino 总是发送一些东西。

任何帮助将不胜感激。

【问题讨论】:

    标签: android arduino arduino-uno serial-communication usbserial


    【解决方案1】:

    我已经找到了解决这个问题的方法。通过阅读this link,我注意到我需要对onReceivedData 方法中收到的数据进行一些操作。 所以我改变了mCallBack如下:

    private UsbSerialInterface.UsbReadCallback mCallback = new UsbSerialInterface.UsbReadCallback() {
    
            @Override
            public void onReceivedData(byte[] arg0)
            {
                if(arg0!= null && arg0.length > 0){
                    if (isStartByte(arg0[0])) {
                        printData();
                        clearBytes();
                    }
                    appendBytes(arg0);
                }
            }
        };
    

    这是我添加的其他方法:

        private void clearBytes(){
            buffer=new byte[8];
            bufferSize = 0;
        }
    
        private void appendBytes(byte[] buf){
            System.arraycopy(buf, 0, buffer, bufferSize, buf.length);
            bufferSize += buf.length;
        }
    
        private void printData() {
            if (bufferSize == 0) {
                return;
            }
            byte[] buf = new byte[bufferSize];
            System.arraycopy(buffer, 0, buf, 0, bufferSize);
    
            String data = null;
            try {
                data = new String(buf, "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            if (null != data && !data.isEmpty()) {
                System.out.println("data: " + data);
            }
        }
    
        public boolean isStartByte(byte firstChar){
            return firstChar=='A';
        }
    

    我还修改了 Arduino 代码并将字符 A 添加到串行输出的开头。 这解决了这个问题,但是我认为这不是最佳实践。我认为 UsbSerial 库应该提供更好的输出处理(或者我错了,这就是使用串行通信的本质)。

    【讨论】:

    • 这是几乎最佳实践..您应该使用 \n 作为匹配输入的分隔符,因为您做事的方式@ 987654327@ 不会在最后一条数据上调用,直到新输入到达。另外,如果bufferSize 超过大小 buffer 会怎样?
    • @PatrickTrentin 基于我从串口传递的数据,没有办法超过缓冲区大小,但您的评论完全有效,我也需要处理这种情况。谢谢
    猜你喜欢
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多