Forum: PC-Programmierung RS232 Integer lesen (C)


von Sir.Tom (Gast)


Lesenswert?

Hallo Gemeinde,

ich möchte einen AVR mit meinem Linux-PC per RS232 kommunizieren lassen.
Mit ASCII-Daten hat das auch halbwegs funktioniert, ich möchte aber 
Messwerte direkt als INT versenden/lesen und da hakt es irgendwie!

folgendes sendet der AVR:
1
void uart_putint (uint32_t data)  
2
{
3
  while (data >= 0)
4
  {
5
    while (!(UCSRA & (1<<UDRE)))
6
    {
7
    }
8
    UDR = data;
9
    data = data >> 8;
10
    }
11
}
12
/********************/
13
14
uart_putint(0x01234567);

So empfängt der PC:
1
int res,tr;
2
char BufferRX[16];
3
while(1)                 
4
  {
5
  res=read(fd232,BufferRX,4);
6
  printf("Read:%i %s\n",res,BufferRX);
7
  sscanf(BufferRX,"%04c",&tr);
8
  printf("ITP: %04x\n",tr);
9
  sleep(1);
10
  }

Starte ich das Programm auf dem PC bekomme ich folgende Ausgabe:
Read:4 gE#
ITP: 1234567

Aber nur beim 1. starten des Programms. Beim 2. mal nur noch dies:
Read:4
ITP: 0000

Um wieder richtige Werte zu bekommen muss ich erst den AVR neu starten,
wobei dieser doch immer das selbe sendet.

Wie kann ich dies eleganter Lösen, was mache ich falsch?
Noch andere Ideen?


Vielen Dank und Gruß,
Thomas

von Karl H. (kbuchegg)


Lesenswert?

Sir.Tom schrieb:

> void uart_putint (uint32_t data)
> {
>   while (data >= 0)
>   {
>     while (!(UCSRA & (1<<UDRE)))
>     {
>     }
>     UDR = data;
>     data = data >> 8;
>     }
> }

Dir ist klar, dass das eine Endlosschleife ist?

Für einen unsigned Wert gilt IMMER, dass er größer/gleich 0 ist.

von Sir.Tom (Gast)


Lesenswert?

Naja, das hätte mir klar sein sollen! Anfängerfehler ;)


Vielen vielen Dank, sieht schon besser aus!

Gruß,
Thomas

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.