Home : Course Map : Chapter 23 :
Port Operations
JavaTech
Course Map
Chapter 23

Access Platform
System Properties
  Demo 1
Run Ext. Programs
  Demo 2
Java Comm API
Port Classes
Port Operations
  Demo 3   Demo 4   Demo 5
Serial Port IO
Demo: Serial Port
  Code Listings

    Demo 6
Parallel Port
Port I/O Apps
Exercises

     About JavaTech
     Codes List
     Exercises
     Feedback
     References
     Resources
     Tips
     Topic Index
     Course Guide
     What's New

In the previous page we discussed classes CommPort and CommPortIdentifier, which provide information and access for communications ports. Here we look at how to use those classes.

 Listing Ports

The CommPortIdentifier class javax.comm.acts as both a source of information about ports on a system and also as a descriptor of an individual port. The static method getPortIdentifers() in the class provides a list of CommPortIdentifier objects for each port, serial and parallel, on the platform.

 Enumeration portList = CommPortIdentifier.getPortIdentifiers ();

This enumeration lists the instances of CommPortIdentifier, one for each port. The methods of this class provide information about the particular port such as its name and type via getName() and getPortType(), respectively.

PortList

import javax.comm.*;
import java.util.*;

/** List all the ports available on the local machine. **/
public class PortList {
  public static void main (String [] args) {

    Enumeration port_list = CommPortIdentifier.getPortIdentifiers ();

    while (port_list.hasMoreElements()) {
      CommPortIdentifier port_id =
        (CommPortIdentifier)portList.nextElement ();

      if (portId.getPortType () == CommPortIdentifier.PORT_SERIAL) {
          System.out.println ("Serial port: " + port_id.getName());
      }
      else if (port_id.getPortType () ==
               CommPortIdentifier.PORT_PARALLEL) {
         System.out.println ("Parallel port: " + port_id.getName ());
      }
      else
        System.out.println ("Other port: " + port_id.getName ());
    }
  } // main
} // class PortList

 

We used the constants PORT_SERIAL and PORT_PARALLEL from the CommPortIdentifier class to test for the port type. On a desktop machine with four serial ports and two parallel ports, the output would go as

Serial port: COM1
Serial port: COM2
Serial port: COM3
Serial port: COM4
Parallel port: LPT1
Parallel port: LPT2

Conversely, you can test for the presence of a port with a particular name as follows.

PortTest
import javax.comm.*;
import java.util.*;

/** Look for COM# ports on the local machine. **/
public class PortTest
{
  public static void main (String [] args) {
    String port_name;
    int i = 0;
    while (true){
      i++;
      port_name = "COM" + i;

      try {
        CommPortIdentifier port_id =
             CommPortIdentifier.getPortIdentifier (portName);
         System.out.println ("Port " + port_name + " exists");

      }
      catch (NoSuchPortException e) {
        System.out.println ("No port " + port_name);
        break;
      }
    }
  } // main
} // class PortTest

 

The output then might go as

Port COM1 exists
Port COM2 exists
Port COM3 exists
Port COM4 exists
No port COM5

The following methods in CommPortIdentifier provide information about the status of a port:

  • boolean isCurrentlyOwned () - indicates if another Java application owns the port.
  • String getCurrentOwner () a description of the Java application that owns a port.

Unfortunately, these methods only work properly if the port is owned by a Java application and not by a different type of program.

Opening Ports

If a port is available you can take exclusive possession of it via one of the two overloaded open() methods and then use the port for reading and writing to the external device connected to the port.

The CommPortIdentifier  method

 CommPort open (String ownerName, int timeout) 
          throws PortInUseException

takes possession of the port and passes it the name of the owning application. The timeout parameter will determine how long in milliseconds the method will block (that is, not return from the method) while waiting for the port to become available.

For systems such as Unix where ports can be assigned a FileDescriptor, this overloaded open method is provided: 

  CommPort open (java.io.FileDescriptor fd)
           throws UnsupportedCommOperationException

Below we show an example where ports are opened. If they are owned by some other application, a PortInUseException is caught. If the owner is a Java program, it can be identified by the name given in the open method, otherwise there is no name available.

PortListOpen

import javax.comm.*;
import java.util.*;

/** Check each port to see if it is open. **/
public class PortListOpen {

  public static void main (String [] args) {

    Enumeration port_list = CommPortIdentifier.getPortIdentifiers ();

    while (port_list.hasMoreElements ()) {
      // Get the list of ports
      CommPortIdentifier port_id = 
        (CommPortIdentifier) port_list.nextElement ();

      // Find each ports type and name
      if (port_id.getPortType () == CommPortIdentifier.PORT_SERIAL) {
          System.out.println ("Serial port: " + port_id.getName ());

      } else if (port_id.getPortType () ==
                 CommPortIdentifier.PORT_PARALLEL) {
          System.out.println ("Parallel port: " + port_id.getName ());

      } else
          System.out.println ("Other port: " + port_id.getName ());

      // Attempt to open it
      try {
        CommPort port = port_id.open ("PortListOpen",20);
        System.out.println ("  Opened successfully");
        port.close ();

      }
      catch  (PortInUseException pe){
          System.out.println ("  Open failed");
          String owner_name = port_id.getCurrentOwner ();
          if (owner_name == null)
              System.out.println ("  Port Owned by unidentified app");
          else
              // The owner name not returned correctly unless it is
              // a Java program.
              System.out.println ("  " + owner_name);
      }
    }
  } //main
} // PortListOpen

 

Output from this application might go as

Serial port: COM1
  Opened successfully
Serial port: COM2
  Opened successfully
Serial port: COM3
  Open failed
  Port currently not owned
Serial port: COM4
  Open failed
  Port currently not owned
Parallel port: LPT1
  Opened successfully
Parallel port: LPT2
  Open failed
  Port currently not owned

To monitor a port for changes in its ownership, you can implement the CommPortOwnershipListener interface. You must override the method ownerShipChange(int typeChange), which can detect three types of ownership (ownership attained, port now available, ownership requested)  changes.

Port Communications Procedure

The steps to communicate over a port go as follows:

  1. Invoke  open() in the port's CommPortIdentifier instance to obtain a CommPort object for that port.
  2. Invoke the getInputStream() and  getOutputStream() in  the CommPort object to obtain provide the streams for reading and writing data from and to the port.
  3. Carry out the desired I/O with the streams.
  4. Invoke close() with the CommPort object, which will release the port for other applications to use.

Other CommPort methods set parameters for the port communications such as the input/output buffer sizes and how long the read operation will wait for data before returning.

References and Web Resources


Most recent update: Dec. 13, 2004
  
  Part I Part II Part III
Java Core 1  2  3  4  5  6  7  8  9  10  11  12 13 14 15 16 17
18 19 20
21
22 23 24
Supplements

1  2  3  4  5  6  7  8  9  10  11  12

Tech 1  2  3  4  5  6  7  8  9  10  11  12
Physics 1  2  3  4  5  6  7  8  9  10  11  12

Java is a trademark of Sun Microsystems, Inc.