Arduino可以从控制台读取字节,但不能从java读取字节



我想从Java程序接收Arduino Uno上的多个字节。arduino 在收到数据后立即处理数据,因此我不需要存储它,我使用 Serial RX 缓冲区作为临时存储,直到我实际读取字节。完全实现后,每次将发送大约 150 个字节,但我已经修改了缓冲区大小来解决这个问题。我使用jSerialComm作为java的串行库

我在下面放了一些arduino和java代码。当我从 IDE 的串行监视器发送字节时,arduino 代码可以完美运行,按预期点亮 LED。但是一旦我尝试使用 java 代码发送字节,板载 RX LED 就会闪烁,但黄色 LED 永远不会亮起,ExecuteMove() 也不会触发。在尝试关闭端口之前,我尝试放置一个 Thread.sleep(),但这无济于事。

阿杜伊诺

int GREEN = 4;
int BLUE = 3;
int YELLOW = 2;
void setup() {
pinMode(GREEN, OUTPUT);
pinMode(BLUE, OUTPUT);
pinMode(YELLOW, OUTPUT);
Serial.begin(9600);
}
void loop() {
byte rb = Serial.read();
if(rb != 255){ //Documentation says it sould be -1, but I'v tested it and 
it's 255
digitalWrite(YELLOW, HIGH);
ExecuteMove(rb);
delay(500);
digitalWrite(YELLOW, LOW);
}
}
void ExecuteMove(byte _move){ 
Lights up the green LED if _move == 65, blue if 66 (Works perfectly)  
}

爪哇岛

public static void main(String[] args) throws IOException, 
InterruptedException{
SerialPort sp = SerialPort.getCommPort("COM3");
sp.setComPortParameters(9600, 8, 1, 0);
sp.setComPortTimeouts(SerialPort.TIMEOUT_WRITE_BLOCKING, 0, 0);
if(sp.openPort()) {
System.out.println("Port is open");
}else {
System.out.println("Port failed to open");
return;
}
byte[] message = {65, 66, 65};
for(int i = 0; i < message.length; i++) {
sp.getOutputStream().write(message[i]); //Sends the message
sp.getOutputStream().flush();
}
if(sp.closePort()) { 
System.out.println("Port is closed"); 
}else { 
System.out.println("Failed to close port"); 
return; 
} 
}  

正如我已经说过的,单独的arduino代码可以与显示器完美配合,但是当我使用java代码发送字节时,只有RX LED亮起,但没有一个"我的"LED亮

对于任何偶然发现这篇文章和接缝的人来说,都有类似的问题,这是因为 Windows 在打开端口时向 arduino 发送重置信号。因为它会立即发送数据,所以Arduino在重置时会将其从缓冲区中删除,并且永远无法读取它。有两种主要方法可以纠正此问题,首先在打开端口和发送数据之间添加Thread.sleep(5000);。您还可以在 RESET 和 GND 引脚之间添加一个 47μF 电容器。

来源:https://arduino.stackexchange.com/questions/22267/java-jssc-arduino-windows https://forum.arduino.cc/index.php?topic=96422.0

希望这可以帮助某人

最新更新