Forum: Compiler & IDEs 24 bit über RS232


von Christoph (Gast)


Lesenswert?

Hallo,
Ich würde gerne ca.24 bit, darf auch ein long int also 32 bit sein, zw. 
pc und atmega32 senden (beide Richtungen)über die RS232. Labview soll 
mit dem µC Daten austauschen(gehört zu meiner Diplomarbeit). 8 bit 
funktionieren bei mir schon sehr gut (mit Hterm), der Empfang läuft über 
ISR.
Nun bin ich etwas Ratlos da ich keine Programmiererfahrung und auch µC 
nur aus meinem Studium kenne.
Wie splitte ich das ganze auf bzw. wie mach ich klar, dass die 3 oder 4 
Byte zusammen gehören. Wie füge ich eine Nachricht richtig zusammen wenn 
ich Daten empfange. Da ich nur 3 Byte brauche soll ich dann im 4 Byte 
zB. FF übertragen damit ich das ende erkenne?

Ich hab leider noch nichts passendes im Tutorium bzw. Forum gefunden.
Ich bin für jeden Hinweis dankbar.

von 6645 (Gast)


Lesenswert?

Es gibt verschiedene Moeglichkeiten, die sind verschieden aufwendig. Was 
geschieht wenn mal ein Byte der 3 noetigen bytes verloen geht ? Waere 
das tragisch ? Wenn es einigermassen sicher sein soll, sendet man einen 
Header und dann die Daten. Der Header kann ein, zwei, drei bytes gross 
sein.

von Christoph (Gast)


Lesenswert?

ich denke es wär nicht so tragisch da sich die nachrichten periodisch 
wiederholen.
Aber ich hab mir nochmal das tutorium durchgelesen und bin auf 
"Schreiben von Variableninhalten" gestoßen mit uart_puts und uart_putc. 
Wenn ich jetzt zB. in die Variable 0xacf0 schreibe und in der funktion 
itoa die 10 auf 16 ändere überträgt er mir 4Byte acfo in ASCII. wie kann 
ich das ändern, damit er nur zwei byte überträgt also ac fo in hex ???

von Karl H. (kbuchegg)


Lesenswert?

Christoph wrote:
> ich denke es wär nicht so tragisch da sich die nachrichten periodisch
> wiederholen.

Das du dich da mal nicht täuscht.
Wenn ein Byte verloren geht (oder sich dein PC Programm auf das
falsche Byte synchronisiert) und dein PC Programm so geschrieben
ist, dass es immer 4 aufeinanderfolgende Bytes zusammenfasst, dann
werden auf PC Seite die Bytes durcheinander kommen.

Irgendeine Form der Synchronisierung nach dem Muster: 'Jetzt fängt
ein neuer Datensatz an' muss es praktisch immer geben.
Ansonsten ist es nur ein kleiner Schritt zum Chaos.

> Aber ich hab mir nochmal das tutorium durchgelesen und bin auf
> "Schreiben von Variableninhalten" gestoßen mit uart_puts und uart_putc.

Das überträgt in Textform. Du willst aber eine binäre Übertragung.

> Wenn ich jetzt zB. in die Variable 0xacf0 schreibe und in der funktion
> itoa die 10 auf 16 ändere überträgt er mir 4Byte acfo in ASCII. wie kann
> ich das ändern, damit er nur zwei byte überträgt also ac fo in hex ???

Indem du nicht itoa benutzt um von einer Binärzahl die textuelle
Repräsentierung zu ermitteln, sondern die beiden Bytes direkt
mit uart_putc() überträgst.
1
  unsigned int number;
2
3
  uart_putc( (unsigned char)( number >> 8 ) );    // zuerst das HighByte
4
  uart_putc( (unsigned char) number );            // dann das Low Byte

von Christoph (Gast)


Lesenswert?

Vielen Dank funktioniert

da ich bei ca. 22 benötigten bits eh eine long int übertragen werde, 
habe ich noch genügend frei die ich zur synchronisierung in LabView 
verwenden kann. danke für den hinweis

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.