繁体   English   中英

从Java到Arduino的缓慢串行传输

[英]Slow serial transfer from Java to Arduino

我在Java和Arduino之间进行双向通信,但是发现从Java向Arduino发送数据时,大约需要3.5秒才能显示在草图中。

从Arduino发送到Java的数据没有这种延迟。

知道为什么会这样吗?

Arduino代码。 这是我的主要循环

void loop() {
  connection.sendData(systemVariables);
  connection.receiveData(systemVariables);
  world(systemVariables, ctr++);
}

这是发件人,

 void  sendData(SystemVariables &sv) {
      String msg = String(sv.getReference());
      String pstr = String(sv.getPosition(), 2);
      msg = msg + "," ;
      msg = msg + pstr;
      msg = msg + "," ;
      msg = msg + sv.getOutput();
      Serial.println(msg);
    }

这是接收者,

 float receiveData(SystemVariables &sv) {

            String str;

            while (Serial.available() > 0) {
              str = Serial.readStringUntil('\n');
              Serial.print('>');
              Serial.println(str);
            }
            if (str.length() > 0)
              sv.setOutput( str.toFloat());

      return sv.getOutput();
    }

Java Java循环有25毫秒的延迟。

接收者

 public synchronized void serialEvent(SerialPortEvent oEvent) {
        //System.out.println("ET " + oEvent.getEventType());
        if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
            String inputLine = null;
            try {
                inputLine = input.readLine();
                if (inputLine.length() > 0) {
                    logger.log(Level.INFO, "{0}", inputLine);
                    if (!inputLine.startsWith(">")) {
                        String[] arr = inputLine.split(",");
                        for (int i = 0; i < arr.length; i++) {

                            try {
                                float newf = Float.parseFloat(arr[i]);
                                try {
                                    if (data.size() <= i) {
                                        data.add(newf);
                                    } else {
                                        data.set(i, newf);
                                    }

                                } catch (IndexOutOfBoundsException e) {
                                    logger.warning(e.toString());
                                }
                            } catch (NumberFormatException e) {
                                logger.log(Level.WARNING, "{0} <{1}> <{2}>", new Object[]{e.toString(), inputLine, arr[i]});
                            }
                        }
                    }
                }
            } catch (IOException ex) {
                Logger.getLogger(SerialSensorSingleton.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception e) {
                logger.warning(e.toString() + " Data received " + inputLine == null ? "null" : "<" + inputLine + ">");
            }

        }
    }

发件人

 public void write(String s) throws IOException {
        logger.log(Level.INFO, ":{0}", s);
        output.write(s.getBytes());
        output.flush();
    }

我现在已经解决了。 问题是我试图用异步方法实现同步通信。

也就是说,我正在使用SerialEvent侦听器,但这仅用于单向通信。 我试图使用该端口以另一种方式将数据发送回去,但是它在一定时期内被建立的数据队列所阻塞。

我已将方法调用更改为读写,以便每一端仅发送一条消息,然后等待传入的数据。 这样,每一端都可以同步,并且现在就像梦一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM