I have been googling and reading allot and i am just not coming right,
What i want to do..
I want to be able to send a command to my arduino in the format of
(motor,state) motor being an int (0-4) and state ( -1(backwards) , 0 (off) , 1 (forwards)
K now that part is not so important,
All i am looking for is a SIMPLE understandable example of java code, ( i am no pro at java, did it at school but nothing to crazy)
Than can simply transmit data to the arduino via serial cable, I have tried about 5 different examples and they all weird ass complicated java and they just output random data (very fast)
Is communication over the ether shield easier that serial? in regards to the packets and TCP and them being delivered etc.
Or is it still going to use serial over the Ethernet connection.
import java.io.InputStream;
import java.io.OutputStream;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.util.Enumeration;
public class SerialTest implements SerialPortEventListener {
SerialPort serialPort;
/** The port we're normally going to use. */
private static final String PORT_NAMES[] = {"COM3" };
/** Buffered input stream from the port */
private InputStream input;
/** The output stream to the port */
private OutputStream output;
/** Milliseconds to block while waiting for port open */
private static final int TIME_OUT = 2000;
/** Default bits per second for COM port. */
private static final int DATA_RATE = 9600;
public void initialize() {
CommPortIdentifier portId = null;
Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();
// iterate through, looking for the port
while (portEnum.hasMoreElements()) {
CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
for (String portName : PORT_NAMES) {
if (currPortId.getName().equals(portName)) {
portId = currPortId;
break;
}
}
}
if (portId == null) {
System.out.println("Could not find COM port.");
return;
}
try {
// open serial port, and use class name for the appName.
serialPort = (SerialPort) portId.open(this.getClass().getName(),
TIME_OUT);
// set port parameters
serialPort.setSerialPortParams(DATA_RATE,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
// open the streams
input = serialPort.getInputStream();
output = serialPort.getOutputStream();
// add event listeners
serialPort.addEventListener(this);
serialPort.notifyOnDataAvailable(true);
} catch (Exception e) {
System.err.println(e.toString());
}
}
/**
* This should be called when you stop using the port.
* This will prevent port locking on platforms like Linux.
*/
public synchronized void close() {
if (serialPort != null) {
serialPort.removeEventListener();
serialPort.close();
}
}
/**
* Handle an event on the serial port. Read the data and print it.
*/
public synchronized void serialEvent(SerialPortEvent oEvent) {
if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
try {
int available = input.available();
byte chunk[] = new byte[available];
input.read(chunk, 0, available);
// Displayed results are codepage dependent
System.out.print(new String(chunk));
} catch (Exception e) {
System.err.println(e.toString());
}
}
// Ignore all the other eventTypes, but you should consider the other ones.
}
public static void main(String[] args) throws Exception {
SerialTest main = new SerialTest();
main.initialize();
System.out.println("Started");
}
}
You may not invent you own protocol, but use Firmata protocol: Arduino Playground - Firmata
It has some drawbacks (it is binary and can't be used to type in console), but it has some advantages also, f.e. processing and java implementation: GitHub - 4ntoine/Firmata: Firmata pure Java implementation and it already has arduino firmware, so you don't need to write your own.
I'm sorry, i did not express myself correctly. Yes, you may invent your own protocol and it may be better.
But you don't have to, because there are already existing solutions and why not use them, if they correspond to your goals.