通过USB发送Arduino到Java数据

通过USB发送Arduino到Java数据,java,arduino,accelerometer,rxtx,Java,Arduino,Accelerometer,Rxtx,我正试图从Arduino的IMU将加速度计数据输入Java应用程序。当我在Arduino IDE上运行我的Arduino程序并启动串行监视器时,数据流非常好。不幸的是,当我试图运行Java代码时,发生了一些奇怪的事情。我必须等待10秒钟,然后立即出现大约1000行。然后我不得不再等待10-20秒,然后又出现了1000行数据。。Arduino是否以包的形式发送数据?难道我不能在IMU给我一个值后立即得到它吗 Arduino代码: #include <MPU9250.h> #incl

我正试图从Arduino的IMU将加速度计数据输入Java应用程序。当我在Arduino IDE上运行我的Arduino程序并启动串行监视器时,数据流非常好。不幸的是,当我试图运行Java代码时,发生了一些奇怪的事情。我必须等待10秒钟,然后立即出现大约1000行。然后我不得不再等待10-20秒,然后又出现了1000行数据。。Arduino是否以包的形式发送数据?难道我不能在IMU给我一个值后立即得到它吗

Arduino代码:

 #include <MPU9250.h>
 #include <quaternionFilters.h>

 #define AHRS true         // Set to false for basic data read
 #define SerialDebug true  // Set to true to get Serial output for debugging

 // Pin definitions
 int intPin = 12;  // These can be changed, 2 and 3 are the Arduinos ext int pins
 int myLed  = 13;  // Set up pin 13 led for toggling

 MPU9250 myIMU;

 void setup()
 {
   Wire.begin();

   Serial.begin(38400);

   pinMode(intPin, INPUT);
   digitalWrite(intPin, LOW);
   pinMode(myLed, OUTPUT);
   digitalWrite(myLed, HIGH);

   byte c = myIMU.readByte(MPU9250_ADDRESS, WHO_AM_I_MPU9250);
   if (c == 0x71) // WHO_AM_I should always be 0x68
   {
     myIMU.MPU9250SelfTest(myIMU.SelfTest);
     myIMU.calibrateMPU9250(myIMU.gyroBias, myIMU.accelBias);
     myIMU.initMPU9250();

   } // if (c == 0x71)
   else
   {
     while(1) ; 
   }
 }

 void loop()
 {
   if (myIMU.readByte(MPU9250_ADDRESS, INT_STATUS) & 0x01)
   {  
     myIMU.readAccelData(myIMU.accelCount);  // Read the x/y/z adc values
     myIMU.getAres();

     myIMU.ax = (float)myIMU.accelCount[0]*myIMU.aRes; // - accelBias[0];
     myIMU.ay = (float)myIMU.accelCount[1]*myIMU.aRes; // - accelBias[1];
     myIMU.az = (float)myIMU.accelCount[2]*myIMU.aRes; // - accelBias[2];
   } 

     myIMU.delt_t = millis() - myIMU.count;

     if (myIMU.delt_t>20) // waiting some time to get less data
     {
       if(SerialDebug)
       {
         Serial.println(myIMU.ay*1000);
       }


       myIMU.count = millis();
       myIMU.sumCount = 0;
       myIMU.sum = 0;
     } 
   } 
我一直在学习本教程:


我正在使用sparkfun的Arduino ProMicro和同样来自sparkfun的IMU-MPU9250

似乎您的JAVA代码正在执行阻塞。超时设置中的
SerialPort.TIMEOUT\u READ\u BLOCKING
是什么意思?你说得对!自视频播放后,库SerialPort已更改,此设置正在执行其他操作。我将它设置为
serialPort.TIMEOUT\u SCANNER
,然后在Arduino中,如果(myIMU.delt\u t>20),我甚至可以删除行
。我现在可以发送和收集所有数据,它似乎工作得很好。非常感谢你!看起来您的JAVA代码正在执行阻塞。超时设置中的
SerialPort.TIMEOUT\u READ\u BLOCKING
是什么意思?你说得对!自视频播放后,库SerialPort已更改,此设置正在执行其他操作。我将它设置为
serialPort.TIMEOUT\u SCANNER
,然后在Arduino中,如果(myIMU.delt\u t>20)
,我甚至可以删除行
。我现在可以发送和收集所有数据,它似乎工作得很好。非常感谢你!
package perkusja;
import com.fazecast.jSerialComm.*;
import java.util.Scanner;
import javax.swing.JFrame;
import javax.swing.JSlider;

public class Perkusja {

    public static void main(String[] args) {

    SerialPort[] ports = SerialPort.getCommPorts();
    System.out.println("Select a port:");
    int i = 1;
    for(SerialPort port : ports)
        System.out.println(i++ +  ": " + port.getSystemPortName());
    Scanner s = new Scanner(System.in);
    int chosenPort = s.nextInt();

    SerialPort serialPort = ports[chosenPort - 1];
    if(serialPort.openPort())
        System.out.println("Port opened successfully.");
    else {
        System.out.println("Unable to open the port.");
        return;
    }
    serialPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_BLOCKING, 0, 0);

    Scanner data = new Scanner(serialPort.getInputStream());
            int counter =0;

    while(data.hasNextLine()){
        try{
                       // float kupa = data.nextFloat();
                        System.out.println(data.nextLine());
                        System.out.println("Line number : " + counter++);
                    }catch(Exception e){
                        System.out.println("ERROR");}
        }
    }

}