Auf Thema antworten

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.



Oben