Fehler bei der auswertung eines Char Arrays

Gast #2577451
Lesenswert?

Hallo,


in einem Char Arry habe ich Daten, die ein AVR per RS232 sendet.

Hier der Code des AVRs
1
void uart_putint (uint64_t data)  
2
{
3
  int j;
4
  for (j=0;j<(sizeof(data));j++)
5
  {
6
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
7
    {
8
    }
9
    UDR = data;                      /* sende Zeichen */
10
    data = data >> 8;
11
  }
12
}
13

14
uart_putint( 0x0123456789223344 );

Damit sollte der AVR dann 8 Byte in einem rutsch versenden.



Dann der Code des Linux-PC's:
1
res = read(fd232,BufferRX,32);
2
printf("\nRead:%i %s\n",res,BufferRX); // testausgabe
3
for (j=0;j<8;j++) 
4
{
5
  printf("data %i: %X\n",j,BufferRX[j]);  
6
}


Und nun der Fehler in der Ausgabe: Irgendwie scheint es hier
einen Überlauf oder so zugeben:

Read:8 D3"�gE#
data 0: 44
data 1: 33
data 2: 22
data 3: FFFFFF89
data 4: 67
data 5: 45
data 6: 23
data 7: 1


Warum ist beim 4. Datensatz ein FFFFFF vor den eigentlichen Daten?
Überlauf? Sonst ist im Prinzip alles richtig.

Vielen Dank schon einmal vorab!

Gruß,
Thomas
Gast #2578829
Lesenswert?

Hallo,

sorry ersteinmal .. Ihr habt aber schon richtig geraten ;)

also BufferRX ist ein char Array.

BufferRX[j] ist ja dann auch nur 1 Byte. Die Interpretation dann ist 
wohl
falsch. Aber wie macht man es dann richtig?
Wenn ich in der Ausgabe ein %u einsetze wird -119 angezeigt.
Komme da irgendwie nicht weiter!

Das ich bei Read immer 32 Byte einlese ist im Prinzio auch ein Fehler,
ich hatte das für Testzwecke so hoch gesetzt. Aber das hat ja
mit dem eigentlichen Problem das da FFFFFF angezeigt wird nichts zu tun.

Also, wie wäre denn jetzt die Richtige Lösung?

Ich habe jetzt nochmals was anderes getestet, aber auch so funktioniert 
nicht:
1
for (j=0;j<8;j++) 
2
{
3
  if (j == 0)  
4
    rxb = BufferRX[j];
5
  else
6
    rxb = rxb<<8 | BufferRX[j];
7
  printf("rxdata %i: %016x\n",j,rxb);
8
}

Mit dieser Routine sieht es so aus:

rxdata 0: 0000000000000044
rxdata 1: 0000000000004433
rxdata 2: 0000000000443322
rxdata 3: 00000000ffffff89
rxdata 4: 00000000ffff8967
rxdata 5: 00000000ff896745
rxdata 6: 0000000089674523
rxdata 7: 0000000067452301

Auch hier wieder dieses ominöse FFFFFF. Ich weiß einfach nicht wo
das herkommt. Auch merkwürdig das die ersten 4 Bytes in diesem Fall leer 
bleiben. rxb habe ich als unsigned long long initialisiert, sollte also 
groß genug sein.

Vielen Dank schon vorab!

Thomas
Persönliche Seite #2578842
Lesenswert?

Sir.Tom schrieb:
> Auch hier wieder dieses ominöse FFFFFF.

Das ist nicht ominös, sondern Folge der Vorzeichenerweiterung. 0x89 ist 
ein negativer Wert, jedenfalls wenn es in einem signed char gespeichert 
wird. Und wenn das einem signed int zugewiesen wird, erfolgt eben jene 
Vorzeichenerweiterung, damit das Resultat auch ja negativ bleibt.

Also, wie Dir schon mehrere Leute geschrieben haben:

Nutze unsigned char!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren