A comprehensive Java library for interfacing with Arduino boards through serial, Bluetooth, and Ethernet connections
Serial port communication for connecting to Arduino boards over USB or RS-232. The serial module provides cross-platform native library support with automatic port discovery and reliable message framing using start/stop bytes and escape sequences.
Main class for serial port communication implementing the observer pattern for asynchronous message handling.
class Serial4JArduino implements JArduinoClientObserver, JArduinoSubject {
// Message framing constants
static final byte START_BYTE = 0x12;
static final byte STOP_BYTE = 0x13;
static final byte ESCAPE_BYTE = 0x7D;
// Constructor
Serial4JArduino(String port);
// Communication methods
void receiveMsg(byte[] msg);
void register(JArduinoObserver observer);
void unregister(JArduinoObserver observer);
void close();
// Static utility methods
static HashSet<CommPortIdentifier> getAvailableSerialPorts();
static void registerPort(String port);
static String selectSerialPort();
static void main(String[] args);
}Utility class for managing native serial port libraries across different operating systems.
class NativeLibUtil {
static void copyFile(InputStream in, String to);
}import org.sintef.jarduino.comm.Serial4JArduino;
import org.sintef.jarduino.observer.JArduinoObserver;
import org.sintef.jarduino.*;
public class SerialExample {
public static void main(String[] args) {
// Create serial connection (Windows example)
Serial4JArduino arduino = new Serial4JArduino("COM3");
// Register observer for Arduino responses
arduino.register(new JArduinoObserver() {
@Override
public void receiveMsg(byte[] msg) {
FixedSizePacket packet = JArduinoProtocol.createMessageFromPacket(msg);
System.out.println("Arduino response: " + packet.toString());
}
});
// Send commands to Arduino
FixedSizePacket pinMode = JArduinoProtocol.createPinMode(DigitalPin.PIN_13, PinMode.OUTPUT);
arduino.receiveMsg(pinMode.getPacket());
FixedSizePacket digitalWrite = JArduinoProtocol.createDigitalWrite(DigitalPin.PIN_13, DigitalState.HIGH);
arduino.receiveMsg(digitalWrite.getPacket());
// Clean up
arduino.close();
}
}import org.sintef.jarduino.comm.Serial4JArduino;
import java.util.HashSet;
import gnu.io.CommPortIdentifier;
public class PortDiscoveryExample {
public static void main(String[] args) {
// Get all available serial ports
HashSet<CommPortIdentifier> availablePorts = Serial4JArduino.getAvailableSerialPorts();
System.out.println("Available serial ports:");
for (CommPortIdentifier port : availablePorts) {
System.out.println("- " + port.getName());
}
// Interactive port selection (opens dialog)
String selectedPort = Serial4JArduino.selectSerialPort();
if (selectedPort != null) {
Serial4JArduino arduino = new Serial4JArduino(selectedPort);
// ... use arduino connection
}
}
}// Register custom serial port (useful for non-standard ports)
Serial4JArduino.registerPort("/dev/ttyUSB0"); // Linux
Serial4JArduino.registerPort("COM10"); // Windows
// Create connection to registered port
Serial4JArduino arduino = new Serial4JArduino("/dev/ttyUSB0");# Run the serial communication main method
java -cp jarduino-serial.jar org.sintef.jarduino.serial.Serial4JArduino
# The main method provides interactive serial port selection and basic testingThe serial communication module includes native libraries for:
Native libraries are automatically extracted and loaded at runtime through the NativeLibUtil class.
Serial communication uses a binary framing protocol for reliable message transmission:
This framing ensures message boundaries are correctly identified even with noisy serial connections or partial reads.
The serial implementation handles common serial communication issues:
org.kevoree.extra.osgi.rxtx for cross-platform serial port accessorg.sintef.jarduino.core for protocol and message classesInstall with Tessl CLI
npx tessl i tessl/maven-org-sintef-jarduino--org-sintef-jarduino