使用Java通过串口控制Arduino

使用Java通过串口控制Arduino,java,arduino,serial-port,Java,Arduino,Serial Port,我正在编写一个系统,它使用Java程序通过串口控制Arduino。Arduino从Java程序接收一个字符,并基于该字符执行预编程的操作。当我使用Arduino程序员串行监视器发送字符时,Arduino完全按照预期工作,但是当我尝试从Java发送相同的字符时,Arduino没有响应 以下是Arduino代码: void setup() { Serial.begin(9600); } void loop() { if (Serial.available() == 1) { cha

我正在编写一个系统,它使用Java程序通过串口控制Arduino。Arduino从Java程序接收一个字符,并基于该字符执行预编程的操作。当我使用Arduino程序员串行监视器发送字符时,Arduino完全按照预期工作,但是当我尝试从Java发送相同的字符时,Arduino没有响应

以下是Arduino代码:

void setup() {
  Serial.begin(9600);
}

void loop() {
  if (Serial.available() == 1) {
    char serialData = Serial.read();   

    // Activate servos based on input
    switch (serialData) {
        case '1':
            activateServo();
            break;

        case '2':
            readSensor1();
            break;

        case '3':
            readSensor2();
            break;

        default:
            // Ignore input
            break;

    }
  }
}


void activateServo() {
    // Code removed
}

void readSensor1() {
    // Code removed
}

void readSensor2() {
    // Code removed
}
下面是Java代码。请注意,我正在使用API:

由于Arduino似乎与串行监视器一起工作,我确信该程序在Java程序中。有人知道为什么Java程序似乎没有像预期的那样发送字符“1”吗?

while Duration.betweenstart、Instant.now.toMillis<100{}您确实需要替换这一行。我不知道你们为什么要这样做,但你们最好使用线程;除此之外,你有例外吗?字符编码也可能是一个问题。。。你有没有检查过你的Java代码到底是怎么写的?您可以发送字节码以避免字符编码问题。因此,不是char 1发送字节0x01.while Duration.betweenstart,Instant.now.toMillis<100{},而是需要替换这一行。我不知道你们为什么要这样做,但你们最好使用线程;除此之外,你有例外吗?字符编码也可能是一个问题。。。你有没有检查过你的Java代码到底是怎么写的?您可以发送字节码以避免字符编码问题。因此,发送字节0x01而不是char 1。
import java.io.PrintWriter;
import java.time.Duration;
import java.time.Instant;

import com.fazecast.jSerialComm.SerialPort;

public class SerialWriteTest {
    private static char dataToSend = '1';

    public static void main(String[] args) {
        // Find all available ports
        SerialPort[] computerPorts = SerialPort.getCommPorts();

        // Select COM3
        SerialPort selectedPort = null;

        for (SerialPort p : computerPorts) {
            if (p.getSystemPortName().equals("COM3")) {
                selectedPort = p;
            }
        }

        // Try to open port, terminate execution if not possible
        if (selectedPort == null) {
            return;

        } else if (selectedPort.openPort()) {
            System.out.println(selectedPort.getSystemPortName() + " successfully opened.");

        } else {
            System.out.println(selectedPort.getSystemPortName() + " failed to open.");
            return;
        }

        // Set port to scanner mode
        selectedPort.setComPortTimeouts(SerialPort.TIMEOUT_SCANNER, 0, 0);

        // Read from port and display
        try (PrintWriter output = new PrintWriter(selectedPort.getOutputStream())) {
            // Wait for 100 ms
            Instant start = Instant.now();
            while (Duration.between(start, Instant.now()).toMillis() < 100) {}

            try {
                output.write('1');
                output.flush();
                System.out.println("Sent");

            } catch (Exception e) {
                System.out.println("Failed to send");
            }
        }

        selectedPort.closePort();

        System.out.println("--- Main finished ---");
    }
}