comport编程错误

时间:2012-10-31 06:51:41

标签: java bluetooth serial-port

我将蓝牙接收器与笔记本电脑连接。它在comport 23继续向我发送数据。但我的代码没有检测到这个comport。它给了我一个使用中的列表。任何人都知道这个问题的解决方案。

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");
        }
      }
    }
  }

}

2 个答案:

答案 0 :(得分:0)

Oracle's Doku sais:

  

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

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

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

答案 1 :(得分:0)

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

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

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

此外,Rxtx有不同的版本和包。一些分支和最新版本的Rxtx修改了如何在Windows上枚举端口,所以我认为之前存在问题。请在此处查看Rxtx下载(和分叉):http://rxtx.qbang.org/wiki/index.php/Download

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