我将使其简短而简单。我有一个通过串行通信将数据发送到Java脚本的arduino。在开机和休息时,arduino将不可见的数据发送到需要清除/清除等的串行端口。我尝试了从arduino和Java程序进行串行刷新,但似乎都无法正常工作。我的arduino代码和Java代码发布在下面。在此先感谢!
void setup() {
delay(2500);
Serial.begin(9600);
flushreceive();
pinMode(13, OUTPUT);
}
void loop() {
char input;
if (Serial.available()) {
input = Serial.read();
//Turn on the LED.
if(input == '1'){
digitalWrite(13, HIGH);
Serial.print("ON");
flushreceive();
}
//Have the LED blink 10 times.
if(input == '2') {
Serial.print("OX");
for(int i = 0; i < 10; i++) {
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(100);
flushreceive();
}
}
//Turn off the LED.
if(input == '3') {
digitalWrite(13, LOW);
Serial.print("OFF");
flushreceive();
}
} // END IF SERIAL AVAILABLE
} // END LOOP
void flushreceive() {
while(Serial.available())
Serial.flush();
}
下面是我的Java代码,当按下按钮时,它将代码发送到arduino,后者打开或关闭LED,而arduino发送回确认OFF或ON,但是我没有收到此消息...要么输入一半字符,要么根本不输入字符。
//Listener for the blink button.
btnBlink.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
btnOn.setBackground(null);
btnBlink.setBackground(Color.yellow);
btnOff.setBackground(null);
//Turns on the #13 pin LED and flashes it 10 times.
if(comPort.isOpen() == true) {
InputStream inPut = comPort.getInputStream();
BufferedReader readBuffer = new BufferedReader(new InputStreamReader(inPut));
//Send a 2 to the Arduino and update the user.
lblStatus.setText("Status: LED Blinking");
outPut.print("2");
outPut.flush();
byte[] buffer = new byte[2];
try {
String message = "OX";
int len = inPut.read(buffer);
if (len > 0) {
message = new String(buffer);
System.out.println(message);
}
if (message.trim().contains("OX")) {
btnBlink.setBackground(Color.yellow);
outPut.flush();
} else {
System.out.println("ERROR!!"));
}
} catch (Exception ep) { ep.printStackTrace(); }
} else {
//Update the status/console if the Arduino hasn't been connected.
lblStatus.setText("Status: Connect Arduino");
}
}
});
答案 0 :(得分:0)
我使用了Arduino Playground和rxtx
库中的这段代码来将数据从arduino串行获取到我的Java程序,并且像魔术一样工作。
https://playground.arduino.cc/Interfacing/Java
http://rxtx.qbang.org/wiki/index.php/Download
您只需要设置正确的端口号和波特率(因为波特率通常为:9600
,对于我来说,不同设备的COM端口可能不同,COM3
)
答案 1 :(得分:0)
在您的Arduino草图中,注释掉所有“ flushreceive();”,然后在Arduino IDE中上传并打开串行监视器,然后分别键入1和2。
(我已经使用Arduino UNO测试了您的代码,并且在注释掉所有flushreceive()之后可以正常工作。)
使用非阻塞avdweb_VirtualDelay库而不是延迟。
在Java端使用jssc。jar库进行串行通信。
然后在Java类中实现SerialPortEventListener,然后以serialEvent方法处理接收到的数据。
使用serialPort.readBytes()从Arduino读取。
使用serialPort.writeBytes()写入Arduino。
以及Ardulink库。