我正在使用JSSC类从Arduino Uno接收字符串。 Arduino通过COM3连接到我的计算机。在Arduino的setup void中,它向Java程序发送一个字符串,表明Arduino准备读取串行数据。发生的是,当Java程序读取串行端口时,它将Arduino的字符串拆分为多行并带有空格。我想这是java程序在接收数据时打印数据,而不是等待完整的字符串。我该怎么做,以便程序从Arduino读取字符串并将其保存为字符串,然后将其打印到控制台。
Java:
package jtac;
import jssc.*;
public class JTAC {
public static SerialPort serialPort = new SerialPort("COM3");
public static PortReader portreader = new PortReader(serialPort);
public static boolean ready = false;
public static void main(String[] args) {
try {
serialPort.openPort();//Open serial port
//Thread.sleep(2000);
serialPort.setParams(SerialPort.BAUDRATE_9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);//Set params. Also you can set params by this string: serialPort.setParams(9600, 8, 1, 0);
serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
serialPort.addEventListener(portreader, SerialPort.MASK_RXCHAR);
while(!ready) {} //Wait for Arduino to fire up
}
catch (SerialPortException ex) {
System.out.println(ex);
}
}
}
class PortReader implements SerialPortEventListener {
SerialPort serialPort;
public PortReader(SerialPort serialPort) {
this.serialPort = serialPort;
}
@Override
public void serialEvent(SerialPortEvent event) {
if (event.isRXCHAR() && event.getEventValue() > 0) {
try {
String receivedData = serialPort.readString(event.getEventValue());
System.out.println(receivedData);
if(receivedData == "Arduino Ready") JTAC.ready = true;
} catch (SerialPortException ex) {
System.out.println("Error in receiving string from COM-port: " + ex);
}
}
}
}
Arduino:
String input;
void setup() {
Serial.begin(9600);
Serial.print("Arduino Ready");
}
void loop() {
}
这是控制台的输出:
Ard
uino
Rea
dy
无法从控制台输出中复制Ard前面的空格。 有什么办法可以让我一次完成所有工作吗? 将来我可能也需要再次从Arduino接收数据。 谢谢。
答案 0 :(得分:1)
使用“ #Arduino Ready $”之类的开始和结束标记
其中“#” 表示开始,而“ $” 表示您感兴趣的字符串的结尾。然后您可以使用它们来处理接收到的字节并根据标记进行存储。
选中此awesome tutorial in the forum。
我的代码可能是完全错误的[我在Java中是完全菜鸟],但我认为您可以理解整体思想。
串行事件方法应如下所示
if (event.isRXCHAR() && event.getEventValue() > 0) {
try {
char receivedData = serialPort.read(event.getEventValue());
if (recvData) === '#' {
this.readString = 1
}else if(recvData === '$'){
this.readString = 0
}
if(this.readString == 1){
this.recvStringData.append(receivedData)
System.out.println(this.recvStringData);
}
if(this.recvStringData == "Arduino Ready") JTAC.ready = true;
} catch (SerialPortException ex) {
System.out.println("Error in receiving string from COM-port: " + ex);
}
}
然后将是Arduino代码
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.println("#Hi There$");
}