Vielleicht hilft das weiter:
RXTX einrichten der Seriellenschnittstelle unter Java:
[code=Java]
private static void schnittstelleIni(){
/**
* Comport initialisieren
*/
try {
comPort = CommPortIdentifier.getPortIdentifier(port);
serialPort = (SerialPort) comPort.open("Controller", 5000);
serialPort.setSerialPortParams(38400, SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
serialPort.notifyOnDataAvailable(true);
serialPort.addEventListener( new CommListener());
in = new DataInputStream(serialPort.getInputStream());
out = new DataOutputStream(serialPort.getOutputStream());
} catch (UnsupportedCommOperationException e) {
e.printStackTrace();
} catch (TooManyListenersException e) {
e.printStackTrace();
} catch (NoSuchPortException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (PortInUseException e) {
e.printStackTrace();
}
}
[/code]
Empfang und sende Methode:
[code=Java]
/**
*
*EventListener der Com-Schnittstelle, der die empfangenden Daten auf empfang weiter leitet
*/
public static class CommListener implements SerialPortEventListener{
public void serialEvent(SerialPortEvent event) {
switch (event.getEventType()) {
case SerialPortEvent.DATA_AVAILABLE: empfang();
default:
}
}
}
/**
* empfangende Daten auswerten bzw. ausgeben
*/
private static void empfang(){
try {
byte b = (byte) in.read();
if (b == ETX){
if (daten.substring(0,1).equals("0")){
bvlWert.setText(daten.substring(2, daten.length()));
}
if (daten.substring(0,1).equals("1")){
brlWert.setText(daten.substring(2, daten.length()));
}
if (daten.substring(0,1).equals("2")){
hvlWert.setText(daten.substring(2, daten.length()));
}
if (daten.substring(0,1).equals("3")){
hrlWert.setText(daten.substring(2, daten.length()));
}
daten = "";
}
else{
daten += (char)b;
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static void sende(String text){
try {
text = text.toUpperCase();
out.writeBytes(text + "\r");
Thread.sleep(10);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
[/code]
Auf der AVR Seite steht (in C):
[CODE]
ISR(USART_RXC_vect){
unsigned char nextChar;
// Daten aus dem Puffer lesen
nextChar = UDR;
if( uart_str_complete == 0 ) { // wenn uart_string gerade in Verwendung, neues Zeichen verwerfen
// Daten werden erst in uart_string geschrieben, wenn nicht String-Ende/max Zeichenlänge erreicht ist/string gerade verarbeitet wird
if( nextChar != '\n' &&
nextChar != '\r' &&
uart_str_count < UART_MAXSTRLEN ) {
uart_string[uart_str_count] = nextChar;
uart_str_count++;
}
else {
uart_string[uart_str_count] = '\0';
uart_str_count = 0;
uart_str_complete = 1;
}
}
}
[/CODE]
und als auswertung der empfangenden Daten:
[CODE]
if (uart_str_complete){
char uart_string_copy[UART_MAXSTRLEN + 1] = "";
strcpy(uart_string_copy,uart_string);
if (strcmp(uart_string_copy,"3") == 0){
strcpy(test,uart_string_copy);
strcat(test," ");
int_to_str(fuehler_nr[3].temp_wert,text,10,1);
strcat(test,text);
uart_send_string(strcat(test,"~"));
}
else if (strcmp(uart_string_copy,"2") == 0){
strcpy(test,uart_string_copy);
strcat(test," ");
int_to_str(fuehler_nr[2].temp_wert,text,10,1);
strcat(test,text);
uart_send_string(strcat(test,"~"));
}
else if (strcmp(uart_string_copy,"1") == 0){
strcpy(test,uart_string_copy);
strcat(test," ");
int_to_str(fuehler_nr[1].temp_wert,text,10,1);
strcat(test,text);
uart_send_string(strcat(test,"~"));
}
else if (strcmp(uart_string_copy,"0") == 0){
strcpy(test,uart_string_copy);
strcat(test," ");
int_to_str(fuehler_nr[0].temp_wert,text,10,1);
strcat(test,text);
uart_send_string(strcat(test,"~"));
}
else{
strcpy(stringWert,"NV ~");
uart_send_string(stringWert);
}
uart_str_complete = 0;
_delay_ms(10);
}
[/CODE]
Die funktionsweise ist folgendermaßen:
Das Javaprogramm sendet an den AVR eine Zahl zwischen 0 und 3 (dies entspricht Temperatursensoren) und ein entsprechenden "ende"-Zeichen (\r).
Der AVR liest solange empfangende Daten ein, bis das Steuerzeichen (\r) folgt oder die max. länge
des Empfangspuffers erreicht wurde.
uart_str_complete zeigt an, dass ein vollständiger Befehl empfangen wurde.
Der AVR antwortet mit der Sensornummer und der entsprechenden Temperatur.