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.
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.
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 ???
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 |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.