我正在用Java编写一个程序,它处理从Arduino Uno接收的天气数据。它将数据存储在数据库中,并将其发送到不同的apis。
我使用jSerialComm library来获取数据,这些数据是从Arduino通过串口发送的。我使用的是SerialPortEvent
,它会在Arduino发送任何数据时立即触发(我不使用InputStream
,因为程序中的其他一些东西将不再起作用)。
Javacode:
(在程序的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
...
我的错误在哪里?
发布于 2021-04-29 23:09:34
在摆弄了一下你的代码之后,我已经让它工作了。首先,您需要通过将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已经在每个数字之后发送换行符。
发布于 2019-06-19 22:56:43
尝试在serialEvent
方法中获取SerialPortEvent
类型,然后以流的形式读取数据,以防事件触发数据准备就绪,方法是首先声明应该可以访问的输入流:
InputStream inputStream = comPort.getInputStream();
那么serialEvent
应该是这样的:
@Override
public void serialEvent(SerialPortEvent event) {
switch(event.getEventType())
{
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
System.out.println("empty");
break;
case SerialPortEvent.DATA_AVAILABLE:
try
{
byte[] readBuffer = new byte[inputStream.available()];
while(inputStream.available() > 0)
{
int numBytes = inputStream.read(readBuffer);
}
totalReadBuffer = readBuffer;
System.out.print(new String(readBuffer));
}
catch(IOException e)
{
}
catch(Exception ex)
{
ex.printStackTrace();
}
break;
}
}
}
您可以查看Link以获取完整代码,请注意,用于串行通信的类是SerialPortEventListener
,您可以尝试使用它
https://stackoverflow.com/questions/56670047
复制相似问题