java - jSerialComm - SerialPortEvent.getReceivedData() 在收到 Arduino 消息时返回 null
问题描述
我正在用 Java 编写一个程序,用于处理从 Arduino Uno 接收的天气数据。它将数据存储在数据库中并将其发送到不同的 api。
我使用jSerialComm 库来获取数据,这些数据是通过串口从 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 已经在每个数字之后发送换行符。
推荐阅读
- excel - 行 VBA Excel 的范围
- javascript - 在不返回任何内容的 JavaScript 函数中是否需要返回
- python - 用 scipy 在 Spyder 上阅读 wav
- docker - 如何组织多个 Dockerfile,docker-compose.yaml 和 .dockerignore
- spring - 什么是实体类?
- xamarin - Xamarin webview 中的本机弹出窗口
- php - 无法使用 $_FILES 函数将图像文件发布到给定目录
- python - 如何使用 networkx 访问连接的组件?
- pandas - 将单个元素列表转换为 df 的值
- pandas - 创建额外的列来计算由另一列分组的累积出现次数