【问题标题】:Port currently owned by Unknown Windows Application - Barcode Reading Issue未知 Windows 应用程序当前拥有的端口 - 条码读取问题
【发布时间】:2014-06-13 06:54:22
【问题描述】:

我已经使用 Device Argox 条形码阅读器编写了读取条形码的程序,Java 中的型号为 As-8250。 我正在使用 javax.com jar 进行串行通信。 这是我编写的从端口号 COM13 读取的程序。

我还将 Argox Utility 的默认端口号设置为 COM13。

package scanhandler;


import java.awt.AWTException;
import java.awt.Robot;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Enumeration;
import java.util.Properties;
import java.util.TooManyListenersException;

import javax.comm.CommPortIdentifier;
import javax.comm.PortInUseException;
import javax.comm.SerialPort;
import javax.comm.SerialPortEvent;
import javax.comm.SerialPortEventListener;
import javax.comm.UnsupportedCommOperationException;

public class ScanHandler implements Runnable, SerialPortEventListener {

    private static CommPortIdentifier   myCommPortIdentifier;
    private static Enumeration          portList;
    private static String               TimeStamp;
    private static String               driverClass;
    private static String               connectionString;
    private static String               comPort;    

    private Connection                  myConnection;
    private InputStream                 myInputStream;
    private Robot                       myRobot;
    private SerialPort                  mySerialPort;
    private Thread                      myThread;


    public ScanHandler() {

        // open serial port
        try {
            TimeStamp = new java.util.Date().toString();
            mySerialPort = (SerialPort) myCommPortIdentifier.open("ComControl", 2000);
            //System.out.println(TimeStamp + ": " + myCommPortIdentifier.getName() + " opened for scanner input");
        } catch (PortInUseException e) {
            e.printStackTrace();
        }

        // get serial input stream
        try {
            myInputStream = mySerialPort.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // add an event listener on the port
        try {
            mySerialPort.addEventListener(this);
        } catch (TooManyListenersException e) {
            e.printStackTrace();
        }
        mySerialPort.notifyOnDataAvailable(true);

        // set up the serial port properties
        try {
            mySerialPort.setSerialPortParams(9600,
                SerialPort.DATABITS_8,
                SerialPort.STOPBITS_1,
                SerialPort.PARITY_NONE);
            mySerialPort.setDTR(false);
            mySerialPort.setRTS(false);

        } catch (UnsupportedCommOperationException e) {
            e.printStackTrace();
        }

        // make a robot to pass keyboard data
        try {
            myRobot = new Robot();
        } catch (AWTException e) {
            e.printStackTrace();
        }

        // create the thread
        myThread = new Thread(this);
        myThread.start();
    }

    public void run() {
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {}
    }

    // on scan
    public void serialEvent(SerialPortEvent event) {

        if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {

            StringBuilder myStringBuilder = new StringBuilder();
            int c;
            try {

                // append the scanned data onto a string builder
                while ((c = myInputStream.read()) != 10){
                   if (c != 13)  myStringBuilder.append((char) c);
                }               

                // send to keyboard buffer if it the barcode doesn't start with '5'
                if (myStringBuilder.charAt(0) != '5') {

                    for (int i = 0; i < myStringBuilder.length(); i++) {
                        myRobot.keyPress((int) myStringBuilder.charAt(i));
                        myRobot.keyRelease((int) myStringBuilder.charAt(i));
                    }

                // here's the scanned barcode as a variable!
                } else {
                    TimeStamp = new java.util.Date().toString();
                    System.out.println(TimeStamp + ": scanned input received:" + myStringBuilder.toString());                    
                }

                // close the input stream
                myInputStream.close();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {

        // read ScanHandler properties
        Properties myProperties = new Properties();
        // myProperties.load(new FileInputStream("config.properties"));
        comPort             = "COM13";              

        try {

            // get our pre-defined COM port
            myCommPortIdentifier = CommPortIdentifier.getPortIdentifier(comPort);
            ScanHandler reader = new ScanHandler();

        } catch (Exception e) {
            TimeStamp = new java.util.Date().toString();
            System.out.println(TimeStamp + ": " + comPort + " " + myCommPortIdentifier);
            System.out.println(TimeStamp + ": msg1 - " + e);
        }
    };    
}

->此程序正在侦听端口 COM13。并打印输入流中的字符串(由条形码阅读器扫描)。

->===========================问题在这里================ ======= 当我先插入 USB 并通过设备实用程序强制它使用端口 COM13 时。它工作得很好。 之后,当我运行我的 Java 程序以侦听同一端口时,它会抛出异常

javax.comm.PortInUseException: Port currently owned by Unknown Windows Application
    at javax.comm.CommPortIdentifier.open(CommPortIdentifier.java:337)
    at scanhandler.ScanHandler.<init>(ScanHandler.java:41)
    at scanhandler.ScanHandler.main(ScanHandler.java:141)
Fri Jun 13 12:20:05 IST 2014: COM13 javax.comm.CommPortIdentifier@d1a2f1
Fri Jun 13 12:20:05 IST 2014: msg1 - java.lang.NullPointerException

那么,如果我的 proram 被拒绝在该端口上侦听,我怎么能读取扫描的条形码。

任何帮助将不胜感激。

【问题讨论】:

  • 您需要找出哪个进程已经打开了该串口并结束它,以便您的程序可以打开该端口。

标签: serial-port barcode barcode-scanner


【解决方案1】:

以下将显示当前使用特定端口的应用程序的 PID:

C:\Users\user>netstat -ano | findstr ":5984"

输出将类似于:

  TCP    127.0.0.1:5984         0.0.0.0:0              LISTENING       2036
  TCP    127.0.0.1:5984         127.0.0.1:55706        ESTABLISHED     2036
  TCP    127.0.0.1:5984         127.0.0.1:55710        ESTABLISHED     2036
  TCP    127.0.0.1:5984         127.0.0.1:55711        ESTABLISHED     2036
  TCP    127.0.0.1:5984         127.0.0.1:55712        ESTABLISHED     2036
  TCP    127.0.0.1:5984         127.0.0.1:55713        ESTABLISHED     2036
  TCP    127.0.0.1:5984         127.0.0.1:55714        ESTABLISHED     2036
  TCP    127.0.0.1:55706        127.0.0.1:5984         ESTABLISHED     4716
  TCP    127.0.0.1:55710        127.0.0.1:5984         ESTABLISHED     4716
  TCP    127.0.0.1:55711        127.0.0.1:5984         ESTABLISHED     4716
  TCP    127.0.0.1:55712        127.0.0.1:5984         ESTABLISHED     4716
  TCP    127.0.0.1:55713        127.0.0.1:5984         ESTABLISHED     4716
  TCP    127.0.0.1:55714        127.0.0.1:5984         ESTABLISHED     4716

然后您可以使用tasklist 命令或任务管理器来查找名称:

C:\Users\user>tasklist | findstr "2036"
erl.exe                       2036 Services                   0     15,604 K

【讨论】:

  • 朱利安感谢您的回答,通过您的回答,我可以使用专用端口获取应用程序名称。但问题是我的 Bacode 阅读器设备是否使用任何端口,但如果我必须读取扫描结果,那么我怎么能在同一个端口不发光的情况下阅读它。如果这样做(意味着读取输入流的端口相同),那么它会抛出错误->端口已在使用中。
  • 您是否在 Java 中正确打开了端口?恐怕我不是 Java 程序员,但通常当您打开端口和文件时,您可以设置模式。有些模式是独占的,不会共享。
  • 是的,如我的代码所示,我已正确打开端口,但正如您所说,某些端口是共享的,那么如果我共享 COM13,它可能会起作用,但我不知道如何共享端口.你对此有什么想法吗?
  • 恐怕这就是我对 Java 的了解。如果我有时间,我会尝试挖掘。
猜你喜欢
  • 2015-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-02
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多