首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当收到Arduino消息时,jSerialComm - SerialPortEvent.getReceivedData()返回null

当收到Arduino消息时,jSerialComm - SerialPortEvent.getReceivedData()返回null
EN

Stack Overflow用户
提问于 2019-06-19 22:25:52
回答 2查看 1.5K关注 0票数 0

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

我使用jSerialComm library来获取数据,这些数据是从Arduino通过串口发送的。我使用的是SerialPortEvent,它会在Arduino发送任何数据时立即触发(我不使用InputStream,因为程序中的其他一些东西将不再起作用)。

Javacode:

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

代码语言:javascript
运行
复制
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程序员:

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

代码语言:javascript
运行
复制
void setup() {
 Serial.begin(9600);
}

int i = 0;

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

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

控制台输出:

代码语言:javascript
运行
复制
User-Specified Port
null
null
null 
null
...

我的错误在哪里?

EN

回答 2

Stack Overflow用户

发布于 2021-04-29 23:09:34

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

代码语言:javascript
运行
复制
@Override
public int getListeningEvents() {
    return SerialPort.LISTENING_EVENT_DATA_RECEIVED;
}

然后,您需要解释作为字符串返回的字节数组,方法是将serialEvent方法更改为:

代码语言:javascript
运行
复制
@Override
public void serialEvent(SerialPortEvent event) {
    byte[] newData = event.getReceivedData();
    System.out.print(new String(newData));
}

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

票数 2
EN

Stack Overflow用户

发布于 2019-06-19 22:56:43

尝试在serialEvent方法中获取SerialPortEvent类型,然后以流的形式读取数据,以防事件触发数据准备就绪,方法是首先声明应该可以访问的输入流:

代码语言:javascript
运行
复制
InputStream inputStream = comPort.getInputStream();

那么serialEvent应该是这样的:

代码语言:javascript
运行
复制
@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,您可以尝试使用它

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56670047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档