我正在用Java编写一个程序,处理从Arduino Uno接收到的天气数据。它将数据存储在数据库中,并将其发送到不同的api。
我正在使用jSerialComm library获取数据,该数据是通过Arduino的串行端口发送的。我正在使用SerialPortEvent
,它会在Arduino发送任何数据后立即触发(我不使用InputStream
,因为程序中的其他某些功能将不再起作用)。 / p>
(在程序的主方法中调用了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);
}
}
(现在只是一个简单的测试程序)
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
...
我的错误在哪里?
答案 0 :(得分:1)
在对您的代码进行了一些修改后,我已经开始工作了。首先,您需要通过将 getListeningEvents 方法更新为以下内容,将事件设置为仅在读取数据时触发:
@Override
public void serialEvent(SerialPortEvent event) {
byte[] newData = event.getReceivedData();
System.out.print(new String(newData));
}
然后,您需要通过将 serialEvent 方法更改为这样来解释作为字符串返回的字节数组:
{{1}}
这将打印带有换行符的数字,因为 Arduino 已经在每个数字后发送换行符。
答案 1 :(得分:0)
尝试通过在SerialPortEvent
方法中获取serialEvent
类型,然后在事件触发数据准备就绪的情况下,将数据作为流读取,首先声明该方法应可访问的输入流:
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
,您可以尝试