Ich habe ein bereits erstelltes Beispiel von der RXTX Website bearbeitet. Ich bin neu in Java und Serial Comm Programmierung auch.RXTX serielle Zweiwegekommunikation sendet keine Daten nach dem ersten Lauf
Die App läuft perfekt einmal. Er liest den Puffer vom PIC und sendet die Nummer, die ich eingegeben habe. Die LEDs leuchten und der PIC sendet denselben Puffer zurück und fragt nach einer Nummer. Aber wenn ich es betrete, schalten sich die LEDs aus, nichts leuchtet wieder auf und ich bekomme wieder die Nachricht nach einer Nummer gefragt.
Es ist nichts falsch mit dem weichen des Mikrocontrollers, wie es mit HyperTerminal tadellos funktioniert.
Der Code ist unten:
import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* This version of the TwoWaySerialComm example makes use of the
* SerialPortEventListener to avoid polling.
*
*/
public class Test
{
public Test()
{
super();
}
void connect (String portName) throws Exception
{
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
if (portIdentifier.isCurrentlyOwned())
{
System.out.println("Error: Port is currently in use");
}
else
{
CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);
if (commPort instanceof SerialPort)
{
SerialPort serialPort = (SerialPort) commPort;
serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
InputStream in = serialPort.getInputStream();
OutputStream out = serialPort.getOutputStream();
serialPort.addEventListener(new SerialReader(in));
serialPort.notifyOnDataAvailable(true);
(new Thread(new SerialWriter(out))).start();
}
else
{
System.out.println("Error: Only serial ports are handled by this example.");
}
}
}
/**
* Handles the input coming from the serial port. A new line character
* is treated as the end of a block in this example.
*/
public static class SerialReader implements SerialPortEventListener
{
private InputStream in;
private byte[] buffer = new byte[1024];
public SerialReader (InputStream in)
{
this.in = in;
}
public void serialEvent(SerialPortEvent arg0) {
int data;
try
{
int len = 0;
while ((data = in.read()) > -1)
{
if (data == '\n') {
break;
}
buffer[len++] = (byte) data;
}
System.out.print(new String(buffer,0,len));
}
catch (IOException e)
{
e.printStackTrace();
System.exit(-1);
}
}
}
/** */
public static class SerialWriter implements Runnable
{
OutputStream out;
public SerialWriter (OutputStream out)
{
this.out = out;
}
public void run()
{
try
{
int c = 0;
while ((c = System.in.read()) > -1)
{
this.out.write(c);
}
}
catch (IOException e)
{
e.printStackTrace();
System.exit(-1);
}
}
}
public static void main (String[] args)
{
try
{
(new Test()).connect("COM3");
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Ich habe herausgefunden, dass die Java-App dem zweiten Lauf eine neue Zeile zu der an den PIC gesendeten Zeichenfolge hinzufügt. Zum Beispiel anstelle von '2' sendet es' [neue Zeile] 2' –
Sie sollten wahrscheinlich genau angeben, welche Version von RXTX Sie verwenden und auf welchem Betriebssystem Sie laufen. Es gab Probleme im Zusammenhang mit nicht blockierenden Empfangsereignissen. Beispiel: http://stackoverflow.com/questions/1391946/is-constant-polling-in-rxtx-necessary – kaliatech
Nachdem ich Ihren ersten Kommentar gelesen hatte, fiel mir ein, dass Sie das 'this.out.write 'vielleicht nicht erkennen (c); 'sendet die Eingabetaste (\ n) zusätzlich zu dem von Ihnen eingegebenen Zeichen. Als Ergebnis und abhängig davon, wie Ihr PIC codiert ist, führt das vielleicht zu einem zweiten "Lauf". (Und mit "run", ich denke du meinst die zweite Schleife.) – kaliatech