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