How to access Serial Ports in Java

LucidIoT Network I/O Module for Analog and Digital IO
LucidIoT Secure IoT Network I/O Module
  • 16 analog and digital IO channels
  • HTTPS, Modbus TCP/IP, MQTT, FTP
  • SSL/TLS secured
  • Data logging function
  • Compatible with LucidControl software
  • DIN-Rail enclosure
Read More ...
  • Multi-Protocol
USB Analog and Digital IO Modules

LucidControl USB IO Modules

  • Data acquisition and control
  • Cost effective and flexible
  • Platform independent
  • Windows® and Linux
  • Compatible with Raspberry Pi
  • Clippable on DIN-Rail
Read More ...
  • Industrial & home automation
LucidControl USB Digital I/O - Input Output Module

USB Digital Input Output Module

Read More ...

LucidControl Product Series

  • 4 insulated digital input channels
  • Counters, filters, edge detectors
  • Pulse width modulation and timers
  • 4 solid-state-relay output channels
USB Digital Input Module

USB Digital Input Module

LucidControl Product Series

  • 4 / 8 digital input channels
  • For 5V, 10V and 24V signals
  • Opto insulated contacts
  • Counters and edge detectors
Read More ...
USB Digital Output Module

USB Digital Output Module

LucidControl Product Series

  • Opto insulated option
  • 4 / 8 digital output channels
  • Relay module option
  • Pulse width modulation and timers
Read More ...
  • Switching and power control
USB RTD Input Module Pt100, Pt1000

USB Analog Input Module

LucidControl Product Series

  • Measurement range options
  • 4 / 8 analog input channels
  • e.g. 0-10 V or 0-20mA
  • 14 bit resolution
Read More ...
  • Acquisition of sensor signals
USB Analog Output Module

USB Analog Output Module

LucidControl Product Series

  • 4 analog output channels
  • Output range options
  • e.g. 0 - 10 V or 4 - 20 mA
  • 12 bit resolution
Read More ...
  • 4 - 20 mA current interfaces
USB RTD Input Module Pt100, Pt1000

USB RTD Input Module

LucidControl Product Series

  • 4 / 8 Pt1000 / Pt100 RTD channels
  • Temperature range: +/- 180 °C, 360 °C
  • 0.1 °C resolution
  • Heat control applications
Read More ...
  • Logging of temperatures

[one_third first]

Plug & Play USB IO

[dropcap3]1[/dropcap3]
Turn your computer with LucidControl Plug & Play IO Modules within minutes to a powerful data acquisition, monitoring and control system.
[/one_third]

[one_third]

Data Acquisition & Control

[dropcap3]2[/dropcap3]
Ready for many automation applications. Measure temperatures, control your home, garden or caravan with the outstanding LucidControl IO devices.
[/one_third]

[one_third]

RPi & Beagle Bone

[dropcap3]3[/dropcap3]
LucidControl is compatible with the Raspberry Pi® and Beagle Bone Black which maximizes the number of possible applications.
[button link=”https://www.lucid-control.com/lucidcontrol-usb-io-module-web-demonstration” style=”info” text=”grey” window=”yes”]Read more about …[/button]
[/one_third]


LucidControl goes JAVA

LucidControl goes JAVA

I was a bit of surprised a few weeks ago that Java has only a very limited native access to the serial comports.

We use the serial ports to communicate with our USB IO Modules. These modules have analog and digital IO functionality and they are compatible with USB CDC (Communication Device Class) which means that most operating systems provide a driver which installs a virtual comport.

Microsoft Windows enumerates them as a COMxx device. Linux operating systems give the devices usually names like /dev/ttyACMxx where xx is the identifier number of the port.

I’m familiar with C# which provides the SerialPort class. This is supported by dotNet and also by Mono and runs under Linux as well. I used this class several times for portable applications running mostly under Windows and Linux. Because of this I expected easy access to the serial port under Java as well and I didn’t waste much thought on doing such a common task in Java. But in reality Java does not support them – at least under Microsoft Windows.

In the following I will explain which options are available in order to access serial ports in Java.

CommAPI – Limited native support

The Java Communications API package javax.comm provides an interface to access serial ports. This sounds very good, but has one significant drawback because support for Microsoft Windows was dropped years ago and it is not possible to write portable applications anymore.
Because of this severe restriction I dropped this solution without further investigation.

RXTX

RXTX is the first option which comes one in mind when talking about alternatives of CommAPI. It is a comprehensive and reliable interface which is used in many projects. I used this in our pre-release revisions of JLucidIo Library. JLucidIo is our JAVA API which implements classes encapsulating the functionality of our LucidControl USB IO Modules.

I thought this was a good option because it is relatively easy to install and it is working reliably. So why didn’t we go for it? This has mainly three reasons:

  1. RXTX is not pure java. The hardware dependent part is written in a different language.

    • For Windows the hardware dependent layer is called rxtxSerial.dll and you can see that this part is not Java code. Maybe it was written in C, but I didn’t research this further.
    • This makes it necessary to install different software on different computers which is not what a Java programmer prefers.
  2. I find the API of RXTX needs getting used to. It is different to the SerialPort class in C# and the implementation has one severe drawback.

    • In C a port can be opened by using fopen(comportName) and the comport must be handy when opening the device which is the normal way to do it.
    • RXTX uses a different approach. Before a port can be opened ALL ports must be enumerated and a list of all serial ports is created. This is done by calling CommPortIdentifier.getPortIdentifiers() which isn’t the best idea in my eyes. Enumerating all serial ports by default is pointless when you only intend to open one specific port. And the implementation in RXTX is done a resource consuming way because it makes the operating system to create this list by querying all ports. This may take a long time especially when Bluetooth is involved. The operating system may ask all (Bluetooth) devices for their ability which can take several seconds per port! Have you counted the number Bluetooth ports of your computer? I have to admit that this behavior was only reported for Microsoft Windows, but in my case it took approx. 5 seconds to open a comport. For my tool I couldn’t accept this.
  3. Last but not least the development of RXTX seems to be neglected since 2009.

After all these findings I continued my search and found jSSC eventually.

jSSC (Java Simple Serial Connector)

The jSSC Java Simple Serial Connector is available in version 2.6.0 which is dated on June 2013. It consists only of one JAR file which has to be included to your project.

Like RXTX jSSC has also a OS dependent part but all is included in a single JAR and you do not have to care about the system you want to use your software.

jSSC provides a very simple API. In my case it took less than 30 minutes the replace RXTX by jSSC and it worked out of the box under Microsoft Windows, Ubuntu and on the Raspberry Pi.

There is no more to write because it does exactly what it should – not more not less ;-)

Conclusion

I cannot say much about CommAPI but RXTX and jSSC are worth a look. RXTX is a good approach but because of the reasons I explained it was not the right library for our project and we went for jSSC.

0 replies

Leave a Reply

Want to join the discussion?
Feel free to contribute!

Leave a Reply