Go Down

Topic: Problem interfacing with Java (Read 371 times) previous topic - next topic

Jul 19, 2012, 01:16 pm Last Edit: Jul 19, 2012, 01:27 pm by waterburner123 Reason: 1
I followed the Interfacing with Java tutorial http://www.arduino.cc/playground/Interfacing/Java, but ran into some problems on testing. Currently my Arduino program works fine when I try with manual inputs.

Segment of C Code on Arduino:
Code: [Select]


...

char line[20];
int line_pos = 0;
char action[10];
unsigned long duration;
boolean data_ready = false;

void setup()
{
 Serial.begin(9600);
 delay(1500);
 Serial.println("Ready!");
}

void loop()
{
   char state;
   if(Serial.available()>0)
   {
       delay(20);
       state = Serial.read();
       
       if(state == '!')
       {
         data_ready = true;
         line[line_pos] = state;
         line_pos = 0;
       }
       else
       {
         line[line_pos] = state;
         line_pos = line_pos + 1;
       }
       
       if(data_ready == true)
       {
           split(line);
           Serial.print(action);
           delay(20);
           Serial.print("!");
           delay(20);
           Serial.print(duration);
           delay(20);
           Serial.print("!");
           
           Serial.println("Data has been split");

           if(strcmp(action, "left") == 0)
           {
               Serial.println("Received left");
           }
           else if(strcmp(action, "right") == 0)
           {
               Serial.println("Received rightt");
           }
           else if(strcmp(action, "straight") == 0)
           {
               Serial.println("Received straight");
           }
           
           memset(line, 0, 20);
           data_ready = false;
       }
   }
}  

void split(char input[20])
{
   char *param, *ptr;
   
   param = strtok_r(input, "#", &ptr);
   strncpy(action, param, sizeof(action));
   action[sizeof(action)-1] = '\0';
   
   param = strtok_r(NULL, "!", &ptr);
   duration = strtoul(param, &param, 10);
}

...



When I input "left#123!" I get the following output in the COM which is what I expected. No problems here:

Ready!
left!123!Data has been split
Received left


Now here's my Java code:

Code: [Select]


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[] = {
"/dev/tty.usbserial-A9007UX1", // Mac OS X
"/dev/ttyUSB0", // Linux
"COM3", // Windows
};
/** 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;

private String display = "";

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);

System.out.println(display);

display += (new String(chunk)).trim();
if(display.contains("!"))
{
display = display.substring(0, display.indexOf("!"));

if(display.equals("Ready"))
{
String reply = "left#123!";
byte reply_byte[] = new byte[reply.length()];
reply_byte = reply.getBytes("UTF-16LE");
output.write(reply_byte);
}

display = "";
}

} 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");
}
}



Here's what Java code prints out in console:

Rea


l

0

Data
Datahas
Datahasbee
Datahasbeen sp
Datahasbeen split


The serial input doesn't seem to be read fluidly, but in repeating parts. Can anybody help me diagnose the problem and give me a solution?

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy