我正在做一个小项目,我想通过串行接口与Arduino UNO进行通信。为了适应该库(我正在使用jSerialComm),我尝试编写一个简单的示例,但是即使这个简单的程序也无法按预期工作。 Arduino运行一个简单的草图,该草图仅返回计算机发送的值:
void setup() {
Serial.begin(9600);
}
void loop() {
if(Serial.available())
Serial.println(Serial.read());
}
当我通过内置的串行监视器将值发送给它时,它工作得很好。
我的Java代码似乎是问题所在,但我无法弄清楚:
public static void main(String[] args){
SerialPort port = SerialPort.getCommPort("COM5");
port.setComPortParameters(9600,8,1,0);
port.setComPortTimeouts(SerialPort.TIMEOUT_NONBLOCKING,0,0);
System.out.println("Open port: " + port.openPort());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
Scanner in = new Scanner(port.getInputStream());
PrintWriter out = new PrintWriter(port.getOutputStream(),true);
out.println('a');
out.flush();
System.out.println("> w");
while (in.hasNextLine())
System.out.println("return: " +in.nextLine());
}
我将不胜感激。 谢谢您的答复。
编辑:
玩完这些代码后,经过多次请求,我最终得到了回应。有人知道如何解决这个问题吗?新代码:
package sample;
import com.fazecast.jSerialComm.SerialPort;
import com.fazecast.jSerialComm.SerialPortDataListener;
import com.fazecast.jSerialComm.SerialPortEvent;
import java.io.PrintWriter;
import java.util.Scanner;
public class Test {
static boolean received;
public static void main(String[] args) {
SerialPort port = SerialPort.getCommPort("COM5");
port.setComPortParameters(9600,8,1,0);
port.setComPortTimeouts(SerialPort.TIMEOUT_SCANNER,0,0);
System.out.println("Open port: " + port.openPort());
Scanner in = new Scanner(port.getInputStream());
PrintWriter out = new PrintWriter(port.getOutputStream(),true);
port.addDataListener(new SerialPortDataListener() {
@Override
public int getListeningEvents() {
return SerialPort.LISTENING_EVENT_DATA_AVAILABLE;
}
@Override
public void serialEvent(SerialPortEvent serialPortEvent) {
String input = "";
input = in.nextLine();
System.out.println("return: " + input);
received=true;
}
});
int counter =0;
while(!received) {
System.out.println(counter);
out.println(counter);
out.flush();
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
counter++;
}
out.println('w');
System.out.println("w");
/* String input = in.nextLine();
System.out.println("return: "+input+input.isEmpty());*/
}
}
Arduino上的代码:
void setup() {
Serial.begin(9600);
}
byte in;
int count=0;
void loop() {
if(Serial.available()){
Serial.print(Serial.parseInt());
Serial.print('\n');
}
}
结果控制台输出:
打开端口:true 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
w
返回:25
返回:0
此代码应立即返回计算机发送的值,而ist不会。当我使用Arduino IDE内置的串行监视器以及我尝试过的所有其他串行监视器时,它都可以正常工作。
答案 0 :(得分:0)
我使用while
循环发送请求来解决问题,直到收到所需的响应为止。整个项目可以在GitHub上找到:https://github.com/SF2311/ArduinoUI