gpt4 book ai didi

java - 从串行端口读取给出了分割的字符串

转载 作者:行者123 更新时间:2023-12-02 10:12:14 24 4
gpt4 key购买 nike

我正在使用 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 接收数据。谢谢。

最佳答案

使用开始和结束标记,例如“#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);
while(!Serial);
}

void loop(){
Serial.println("#Hi There$");
}

关于java - 从串行端口读取给出了分割的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54921049/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com