Используя
эту статью на хабре в качестве основы, написал тестовое приложение на Java для передачи и получения данных на/с Arduino.
Привожу код полностью:
package test;
import com.fazecast.jSerialComm.SerialPort;
import arduino.Arduino;
public class test {
public static void main(String[] args) throws InterruptedException {
Arduino arduino = new Arduino("COM5", 9600);
boolean connected = arduino.openConnection();
System.out.println("Соединение установлено: " + connected);
Thread.sleep(2000);
new Reader(arduino).start();
while (true) {
Thread.sleep(10);
arduino.serialWrite('1');
}
}
}
class Reader extends Thread{
Arduino a;
public Reader(Arduino a) {
this.a = a;
}
@Override
public void run() {
try {
SerialPort comPort = a.getSerialPort();
while (true)
{
long t = System.currentTimeMillis();
while (comPort.bytesAvailable() == 0)
Thread.sleep(20);
byte[] readBuffer = new byte[comPort.bytesAvailable()];
comPort.readBytes(readBuffer, readBuffer.length);
System.out.println(new String(readBuffer) + " ms since last read: "+(System.currentTimeMillis()-t));
}
} catch (Exception e) { e.printStackTrace(); }
}
}
А также код на Arduino:
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available() != 0) {
byte b = Serial.read();
Serial.print("Received byte: ");
Serial.println(b);
}
}
По сути в цикле программа просто передаёт данные на ардуину так быстро, как сможет, пока другой поток читает данные с порта. Проблема в том, что передач в секунду очень мало: почему-то очень большая задержка между вызовом arduino.serialWrite('1'); и фактическим приёмом данных на ардуине. Причём проблема точно в программной части Java, так как если открыть Serial monitor из Arduino IDE, то там задержка крайне малая, и в секунду можно раз 20 точно можно передать. В чём проблема?