Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当接收到Arduino消息时,jSerialComm-SerialPortEvent.getReceivedData()返回null_Java_Arduino - Fatal编程技术网

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

Java 当接收到Arduino消息时,jSerialComm-SerialPortEvent.getReceivedData()返回null,java,arduino,Java,Arduino,我正在用Java编写一个程序,处理从Arduino Uno接收到的天气数据。它将数据存储在数据库中,并将其发送到不同的API 我正在使用获取数据,数据通过串行端口从Arduino发送。我正在使用SerialPortEvent,只要Arduino发送任何我不使用InputStream的数据,就会触发SerialPortEvent,因为程序中的一些其他东西将不再工作 Java代码: 在程序的主方法中调用enable 导入com.fazecast.jSerialComm.SerialPort; 导入c

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

我正在使用获取数据,数据通过串行端口从Arduino发送。我正在使用SerialPortEvent,只要Arduino发送任何我不使用InputStream的数据,就会触发SerialPortEvent,因为程序中的一些其他东西将不再工作

Java代码: 在程序的主方法中调用enable

导入com.fazecast.jSerialComm.SerialPort; 导入com.fazecast.jSerialComm.SerialPortDataListener; 导入com.fazecast.jSerialComm.SerialPortEvent; 公共类Arduino实现SerialPortDataListener{ @凌驾 公共无效启用{ SerialPort comPort=SerialPort.getCommPortCOM5; System.out.printlncomPort.getDescriptivePortName; comPort.openPort; comPort.setBaudRate9600; comPort.addDataListenerthis; } @凌驾 公共int GetListingEvents{ 返回SerialPort.LISTENING\u事件\u数据\u可用; } @凌驾 public void serialEventSerialPortEvent事件{ 字节[]newData=event.getReceivedData; System.out.printlnewdata; } } Arduino项目: 现在只是一个简单的测试程序

无效设置{ Serial.begin9600; } int i=0; 空穴环{ Serial.printlni; i++; 延迟1000; } 但无论我在做什么,SerialPortEvent.getReceivedData方法在Arduino发送数据时总是返回null,而不是每秒打印一次的byte[]-对象:

控制台输出: 我的错误在哪里?

尝试在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;
  }
}
}

您可以检查完整的代码,请注意,用于串行通信的类是SerialPortEventListener。您可以尝试使用它来代替它。

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

@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已经在每个数字后面发送换行符。

回答得好@Kwonunn。它充满了细节,它包含了代码示例,并对所提出的解决方案进行了解释。
@Override
public void serialEvent(SerialPortEvent event) {
    byte[] newData = event.getReceivedData();
    System.out.print(new String(newData));
}