Я работаю над небольшим проектом, в котором я хочу общаться с Arduino UNO через последовательный интерфейс.Чтобы привыкнуть к библиотеке (я использую jSerialComm), я попытался написать простой пример, но даже эта простая программа не работает должным образом.Arduino запускает простой набросок, который просто возвращает значение, отправленное компьютером:
void setup() {
Serial.begin(9600);
}
void loop() {
if(Serial.available())
Serial.println(Serial.read());
}
Он отлично работает, когда я отправляю значения на него через встроенный последовательный монитор.
MyКажется, проблема в 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 * 1046 * 23
24
25
w
return: 25
return: 0
Этот код должен немедленно возвращать значение, отправленное компьютером, но ist - нет.Он прекрасно работает, когда я использую последовательный монитор, встроенный в Arduino IDE, а также с любым другим последовательным монитором, который я пробовал.