Java 复合编程错误

Java 复合编程错误,java,bluetooth,serial-port,Java,Bluetooth,Serial Port,我将蓝牙接收器与笔记本电脑连接。它在组件23处向我发送数据。但me代码未检测到此组件。它给了我一个正在使用的组件列表。任何人都知道这个问题的解决办法 import java.io.*; import gnu.io.*; import java.util.*; public class PortReader implements SerialPortEventListener { static Enumeration ports; static CommPortIdentifier

我将蓝牙接收器与笔记本电脑连接。它在组件23处向我发送数据。但me代码未检测到此组件。它给了我一个正在使用的组件列表。任何人都知道这个问题的解决办法

import java.io.*;
import gnu.io.*;
import java.util.*;

public class  PortReader implements SerialPortEventListener  {
  static Enumeration ports;

  static CommPortIdentifier pID;

  InputStream inStream;

  SerialPort serPort;

  public PortReader() throws Exception{
    serPort = (SerialPort) pID.open("PortReader", 2000);
    inStream = serPort.getInputStream();

    serPort.addEventListener(this);

    serPort.notifyOnDataAvailable(true);

    serPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
        SerialPort.PARITY_NONE);
  }

  public void serialEvent(SerialPortEvent event) {
    switch (event.getEventType()) {
    case SerialPortEvent.BI:
      System.out.println("SerialPortEvent.BI occurred");
    case SerialPortEvent.OE:
      System.out.println("SerialPortEvent.OE occurred");
    case SerialPortEvent.FE:
      System.out.println("SerialPortEvent.FE occurred");
    case SerialPortEvent.PE:
      System.out.println("SerialPortEvent.PE occurred");
    case SerialPortEvent.CD:
      System.out.println("SerialPortEvent.CD occurred");
    case SerialPortEvent.CTS:
      System.out.println("SerialPortEvent.CTS occurred");
    case SerialPortEvent.DSR:
      System.out.println("SerialPortEvent.DSR occurred");
    case SerialPortEvent.RI:
      System.out.println("SerialPortEvent.RI occurred");
    case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
      System.out.println("SerialPortEvent.OUTPUT_BUFFER_EMPTY occurred");
      break;
    case SerialPortEvent.DATA_AVAILABLE:
      System.out.println("SerialPortEvent.DATA_AVAILABLE occurred");
      byte[] readBuffer = new byte[20];

      try {
        while (inStream.available() > 0) {
          int numBytes = inStream.read(readBuffer);
        }
        System.out.print(new String(readBuffer));
      } catch (IOException ioe) {
        System.out.println("Exception " + ioe);
      }
      break;
    }
  }


  public static void main(String[] args) throws Exception{
    ports = CommPortIdentifier.getPortIdentifiers();

    while (ports.hasMoreElements()) {
      pID = (CommPortIdentifier) ports.nextElement();
      System.out.println("Port " + pID.getName());

      if (pID.getPortType() == CommPortIdentifier.PORT_SERIAL) {
        if (pID.getName().equals("COM23")) {
          PortReader pReader = new PortReader();
          System.out.println("COM23 found");
        }
      }
    }
  }

}
最高审计机关:

获取枚举对象,该对象包含系统中每个端口的CommPortIdentifier对象

因此,如果您所需的端口未在此处列出,则可能未正确设置。我先检查一下


其次,它的命名可能与您期望的不同。您应该打印出该列表,以查看是否有一个名为类似但与预期不完全相同的端口。

您是否看到设备管理器中列出的COM端口?(“控制面板”->“设备管理器”->“端口”)如果没有,则说明蓝牙驱动程序没有按预期创建COM端口(SPP)

如果确实在那里看到它,则可以尝试使用
-Dgnu.io.rxtx.SerialPorts=COM23
系统属性临时覆盖通用端口枚举,以查看是否连接

有关
gnu.io.rxtx.SerialPorts
属性的更多信息:

此外,Rxtx有不同的版本和软件包。一些forks和Rxtx的最新版本修改了windows上端口的枚举方式,因此我认为以前存在一些问题。请参阅此处的Rxtx下载(和forks):


最后,如果在x64系统上使用,请确保使用的是x64二进制文件。

列表中有什么?你能给我们看一个打印件吗?是的,我能给我们看我的打印件,它是根据System.out.println(“端口”+pID.getName)的组件号;您确定端口的名称吗?是的,我检查了名称,它们都在使用中,但所有已使用的端口在已使用的端口名称显示中仅显示少数。您使用的蓝牙驱动程序/堆栈/版本是什么?RXTX的哪个版本(包括x32和x64)您正在使用吗?但作为我的蓝牙接收器的属性,它通过comport 23向我发送数据,并且在设备管理器中也可以看到它,但我的枚举对象不是DisAnalysorry先生,我无法获取您的答案,您可以详细说明我在哪里可以使用-Dgnu.io.rxtx.SerialPorts=COM23,并且我可以在设备管理器中看到comport 23支持系统属性
gnu.io.rxtx.SerialPorts
显式指定绕过默认枚举代码的可用com端口。我在答案中添加了更多信息的链接。