java - jSerialComm - SerialPortEvent.getReceivedData() 在收到 Arduino 消息时返回 null

标签 java arduino

我正在用 Java 编写一个程序,用于处理从 Arduino Uno 接收到的天气数据。它将数据存储在数据库中并将其发送到不同的 api。

我使用 jSerialComm library获取数据,该数据通过串口从 Arduino 发送。我正在使用 SerialPortEvent,只要 Arduino 发送任何数据,就会触发该事件(我没有使用 InputStream,因为程序中的其他一些事情不会发生”不再工作了)。

Java 代码:

(在程序的main方法中调用enable())

import com.fazecast.jSerialComm.SerialPort;
import com.fazecast.jSerialComm.SerialPortDataListener;
import com.fazecast.jSerialComm.SerialPortEvent;

public class Arduino implements SerialPortDataListener {

    @Override
    public void enable() {
        SerialPort comPort = SerialPort.getCommPort("COM5");
        System.out.println(comPort.getDescriptivePortName());
        comPort.openPort();
        comPort.setBaudRate(9600);
        comPort.addDataListener(this);
    }

    @Override
    public int getListeningEvents() {
        return SerialPort.LISTENING_EVENT_DATA_AVAILABLE;
    }

    @Override
    public void serialEvent(SerialPortEvent event) {
        byte[] newData = event.getReceivedData();
        System.out.println(newData);
    }

}

Arduino 程序:

(现在只是一个简单的测试程序)

void setup() {
 Serial.begin(9600);
}

int i = 0;

void loop() {
  Serial.println(i);
  i++;
  delay(1000);
}

但无论我在做什么,SerialPortEvent.getReceivedData() 方法总是返回 null,而不是 byte[] -Object(当 Arduino 发送数据时,每秒打印一次):

控制台输出:

User-Specified Port
null
null
null 
null
...

我的错误在哪里?

最佳答案

在对你的代码进行了一些修改之后,我已经让它工作了。首先,您需要将 getListeningEvents 方法更新为以下内容,将事件设置为仅在读取数据时触发:

@Override
public int getListeningEvents() {
    return SerialPort.LISTENING_EVENT_DATA_RECEIVED;
}

然后,您需要通过将serialEvent 方法更改为以下内容来解释作为字符串返回的字节数组:

@Override
public void serialEvent(SerialPortEvent event) {
    byte[] newData = event.getReceivedData();
    System.out.print(new String(newData));
}

这将打印带有换行符的数字,因为 Arduino 已经在每个数字后发送换行符。

关于java - jSerialComm - SerialPortEvent.getReceivedData() 在收到 Arduino 消息时返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56670047/

相关文章:

ruby - 使用 Ruby 将字节数组写入串行

c++ - 绘图类组织

c - GPS NMEA 字符串的解析代码

java - 启用 JPA 静态编织(eclipselink)

java - 使用 cxf 验证 wsdl/schema

java - DI 容器与工厂

http - 如何使用 arduino ethernet shield 和 web 客户端保持 HTTP session

javascript - vue js中按特定名称过滤vcard

java 用 printf 显示和格式化

c++ - 在运行时将 char 数组转换为 String?