Forum: Mikrocontroller und Digitale Elektronik AVR - USART Receiver Daten weiterverarbeiten


von Paul (Gast)


Lesenswert?

Hallo,

ich versuche gerade von einem JAVA Programm Daten an den Atmega644 zu 
schicken, dabei handelt sich es genauer gesagt um Zahlen. Diese Zahlen 
sollten, dann am AVR weiterverarbeitet werden.

Hier liegt aber dann das Problem. Ich bekomme die Daten irgendwie nicht 
in den richtigen Datentyp.

Zum Senden beim JAVA-Programmm verwende ich:
1
void sendeSerialPort(String nachricht) {
2
    System.out.println("Sende: " + nachricht);
3
    if (serialPortGeoeffnet != true)
4
      return;
5
    try {
6
      outputStream.write(nachricht.getBytes());
7
    } catch (IOException e) {
8
      System.out.println("Fehler beim Senden");
9
    }
10
  }

Aufrufen tue ich es mit:
1
sendeSerialPort(Integer.toString(sendeWert));

Das wichtigste vom AVR-Code sieht wie folgt aus:
1
int set1, set2;
2
3
unsigned char USART_Receive( void ){
4
  while ( !(UCSR0A & (1<<RXC0)) );
5
  return UDR0;
6
}
7
8
void settings(int setting){
9
  if (setting < 0){
10
    set1 = setting;
11
    set2 = 0;
12
  } 
13
  else{
14
    set1 = setting % 10;
15
    set2 = setting / 10;
16
  }  
17
}
18
void main (void){     
19
  unsigned char setting;
20
  InitUSART(103);    
21
  while(1){      
22
    setting = USART_Receive();
23
    settings(setting);    
24
  }
25
}

Eigentlich möchte ich, wenn ich nun z.B. 13 sende beim AVR set1 = 3 und 
set2 = 1 haben, aber irgendwie sind beide immer 0. Hab schon 
verschiedenes ausprobiert, aber bekomms nicht hin.

Der USART selbst funktioniert, da wenn ich das ganze z.B. mit HTerm 
teste und 13 decimal sende, funktioniert alles wunderbar, nur halt nicht 
mit meinem JAVA-Programm. :(

Weiß jemand, wie ich die empfangenen Daten verarbeiten muss ?

LG Paul

von Sam P. (Gast)


Lesenswert?

Ich steck zwar in AVR nicht mehr so drin, aber dein Java-Code scheint 
mir nicht zum C-Code zu passen.

Dein C-Code empfängt ein einzelnes Byte und interpretiert es als 
vorzeichenbehafteten 8-Bit-Integer. Der Teil funktioniert, wie du ja 
sagst.

Dein Java-Code hingegen wandelt einen Integer in einen String um, und 
sendet dann diesen String. Ich orakele mal, dass dein AVR schon was 
macht, aber das falsche.

13 als 8-Bit-Integer: ein Byte, ASCII-Code 13 (Überraschung!)
13 als String: 2 Bytes, ASCII-Codes 49 und 51

Du müsstest irgendwie sowas wie outputStream.write((byte)sendeWert) 
machen. Wie gesagt, Details bitte selber in der Doku nachgucken, bin 
grad nich im Thema drin.

von Paul (Gast)


Lesenswert?

Danke !
Funktioniert mit outputStream.write((byte)sendeWert) einwandfrei!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.