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