Search code examples
javabytearraysoutputstreamparallel-port

Parallel Port communication Rxtx or javax.comm


Currently I am trying to communicate with a Parallel port via Java, but this has proven to be troublesome. I am currently doing a brain research using EEG and I want to send simple "event markers" to the EEG system, which must happen via Parallel Port. I have used both javax.comm and RXTX but for some reason I cannot manage to write output to the port. The test-code is as follows:

import gnu.io.*; // RXTX
// import javax.comm.*; // javax.comm

public class PrlCom {
private String msg= "1";

private OutputStream outputStream;
private InputStream inputStream;

private ParallelPort parallelPort; // can be both Rxtx or javax.comm 
private CommPortIdentifier port;

// CONSTANTS
public final String PARALLEL_PORT = "LPT1";
public final String[] PORT_TYPE = { "Serial Port", "Parallel Port" };

public static void main(String[] args) {
    new PrlCom();
}
public PrlCom(){
    openParPort();
}

public void openParPort() {
    try {
        // get the parallel port connected to the EEG-system (used to be printer)
        port = CommPortIdentifier.getPortIdentifier(PARALLEL_PORT);

        System.out.println("\nport.portType = " + port.getPortType());
        System.out.println("port type = " + PORT_TYPE[port.getPortType() - 1]);
        System.out.println("port.name = " + port.getName());

        // open the parallel port -- open(App name, timeout)
        parallelPort = (ParallelPort) port.open("CommTest", 50);
        outputStream = parallelPort.getOutputStream();
        inputStream = parallelPort.getInputStream();

        System.out.println("Write...");
        outputStream.write(toBytes(msg.toCharArray()));
        System.out.println("Flush...");
        outputStream.flush();
    } catch (NoSuchPortException nspe) {
        System.out.println("\nPrinter Port LPT1 not found : " + "NoSuchPortException.\nException:\n" + nspe + "\n");
    } catch (PortInUseException piue) {
        System.out.println("\nPrinter Port LPT1 is in use : " + "PortInUseException.\nException:\n" + piue + "\n");
    } catch (IOException ioe) {
        System.out.println("\nPrinter Port LPT1 failed to write : " + "IOException.\nException:\n" + ioe + "\n");
    } catch (Exception e) {
        System.out.println("\nFailed to open Printer Port LPT1 with exeception : " + e + "\n");
    } finally {
        if (port != null && port.isCurrentlyOwned()) {
            parallelPort.close();
        }

        System.out.println("Closed all resources.\n");
     }
}

I got the toBytes() function from Converting char[] to byte[] . I also directly tried spam.getBytes(), which made no difference.

After running this code with the javax.comm package, the parallel port is not recognized. If I run the code with RXTX(gnu.io), I get an IOException. The entire printed output is then as follows

Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version   = RXTX-2.1-7

port.portType = 2
port type = Parallel Port
port.name = LPT1
Output stream opened
Write...

Printer Port LPT1 failed to write : IOException.
Exception:
java.io.IOException: The device is not connected.
    in writeByte

Closed all resources.

With Rxtx, the code can make a connection with the Parallel Port thus. However, it is unable to write a byte to the output stream. Can someone please tell me how to resolve this?

I have read in many of the other topics how outdated a parallel port is and that I should use USB. However, I am working with an EEG-system (BioSemi ActiveTwo with ActiView software) to measure brain activity and, sadly, I don't have the possibility to change this. A Parallel port-USB converter is also no option. (Odd though, that something so technologically advanced uses such outdated hardware).

Thank you so much!


Solution

  • I have accepted that Rxtx and javax.comm do not work anymore. Instead, I found a workaround via Python. For the answer, see Parallel Port Communication with jnpout32pkg / jnpout32reg