I've have a simple echo prog. running on the ArduinoBT connecting from WinXP SP2; and it works fine when using the windows hyper-terminal as a client.
From Java using rxtx 2.1.7, however, it works but requires first manually connecting the serial port service in blueSoleil; then is very slow to send/receive;
finally it does not disconnect the serial port service after completion.
I am thinking that since both windows hyper-terminal & the avrdude loader are able to connect/disconnect automatically and are much faster than Java that maybe I am doing something wrong?
As a bluetooth nube - any assistance is appreciated.
Lee
Java Client Code: public class EchoTest implements SerialPortEventListener, Runnable {
private static final int SPEED_19200 = 115200; private static CommPortIdentifier portId; private static SerialPort serialPort; private static Enumeration<CommPortIdentifier> portList; private static String defaultPort = "COM5"; private OutputStream outputStream = null; private InputStream inputStream = null; private PrintWriter pw = null; public static void main(String[] args) { boolean portFound = false; try { portId = CommPortIdentifier.getPortIdentifier(defaultPort); portFound = true; } catch (NoSuchPortException e1) { // TODO Auto-generated catch block e1.printStackTrace(); }
if (portFound) { EchoTest st = new EchoTest(); Thread xThread = new Thread(st); xThread.start(); try { xThread.join(); st.close(); } catch (InterruptedException e) { } } System.exit(0); }
public void run() { try { setup(); println("1cha cha cha"); println("2cha cha cha"); println("3cha cha cha"); } catch (Throwable e) { System.out.println(e.getMessage()); e.printStackTrace(); } }
public void println(final String s) { String s1 = ""; pw.println(s); }
private void close() { // pw.flush(); // flush causes an exception, but does not seem to be necessary try { pw.close(); outputStream.close(); Thread.currentThread().sleep(1000); inputStream.close(); } catch (Exception e) { e.printStackTrace(); } }
private void setup() { try { serialPort = (SerialPort) portId.open("SimpleReadApp", 2000); } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } try { serialPort.setSerialPortParams(SPEED_19200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); } catch (UnsupportedCommOperationException e) { System.out.println(e.getMessage()); e.printStackTrace(); } try { inputStream = serialPort.getInputStream(); } catch (IOException e) { System.out.println(e.getMessage()); e.printStackTrace(); } try { outputStream = serialPort.getOutputStream(); pw = new PrintWriter(outputStream); } catch (IOException e) { System.out.println(e.getMessage()); e.printStackTrace(); } try { serialPort.addEventListener(this); } catch (TooManyListenersException e) { System.out.println(e.getMessage()); e.printStackTrace(); } serialPort.notifyOnDataAvailable(true); }
public void serialEvent(SerialPortEvent event) { switch (event.getEventType()) { case SerialPortEvent.BI: case SerialPortEvent.OE: case SerialPortEvent.FE: case SerialPortEvent.PE: case SerialPortEvent.CD: case SerialPortEvent.CTS: case SerialPortEvent.DSR: case SerialPortEvent.RI: case SerialPortEvent.OUTPUT_BUFFER_EMPTY: break; case SerialPortEvent.DATA_AVAILABLE: byte[] readBuffer = new byte[20]; try { int numBytes = 0; StringBuilder sb = new StringBuilder(); while (inputStream.available() > 0) { numBytes = (byte) inputStream.read(readBuffer); sb.append(new String(readBuffer, "ASCII").substring(0, numBytes)); } System.out.println("Read: "+sb.toString()); } catch (IOException e) {} break; } } }
|
ArduinoBT Code:void setup() { Serial.begin(115200); }
void loop() { byte val; while (Serial.available()) { // read the most recent byte (which will be from 0 to 255) val = Serial.read(); Serial.print(val, BYTE); } }
|