Hallo zusammen, ich empfange mit einem µC (Renesas M32C) (über den UART) meine gesendete Zeichen, welche von einem 2. µC gesendet werden. Bsp: 10101010 | 10101010 | 01010101 | 01010101 | 01010101 einschwing - preamble - data data data (dies wird zum bsp. alle 5ms gesendet) Mein programm war zuerst so geschrieben, dass die ersten beiden zeichen ignoriert werden und erst danach ein bitvergleich stattfindet. Ich möchte aber die Zeichen nicht einfach ignorieren zum Bsp: 1. Zeichen ignorieren 2. Zeichen auswerten, wenn ja dann bitvergleich, wenn nein dann wieder auf neuen anfang warten oder so ... Ich weiß grad nicht wie ich genau auf den neuen anfang warten soll. Immoment ist es so: if(empfanges Zeichen == 0xAA) // Bitvergleich else // 3 Zeichen einlesen und verwerfen Aber das genau so ein Käse... Vielleicht hat von euch schon jemand etwas in der <Richtung programmiert und kann mir einen Denkanstoß geben. Gruß Timo
Bei deinem Problem würde es sich anbieten einen Zeichenzähler als 'Schmalspur-Statemachine' einzusetzen als Pseudo-Code
1 | Zaehler = 0 |
2 | |
3 | while( 1 ) { // die klassische main-Hauptschleife |
4 | |
5 | if( Zeichen empfangen ) { |
6 | |
7 | if( Zaehler == 0 ) { // müsste das das Einschwingzeichen sein? |
8 | if( Zeichen == 0xAA ) // ist es richtig ? |
9 | Zaehler++; |
10 | }
|
11 | |
12 | else if( Zaehler == 1 ) { // das muesste jetzt die Preambel sein |
13 | if( Zeichen == 0xAA ) // ist sie richtig ? |
14 | Zaehler++; |
15 | else
|
16 | Zaehler = 0; // nein: zurück an Anfang |
17 | }
|
18 | |
19 | else { // Zeichen 2 bis 4: Daten |
20 | if( Zaehler == 4 ) // Wenns das letzt Datenzeichen war |
21 | Zaehler = 0; // dann muss wieder das Einschwingzeichen |
22 | // kommen
|
23 | mach was mit den Zeichen |
24 | }
|
25 | }
|
26 | }
|
Ich würde es mit einem kleinen Automatenrealisieren: state = 0;
1 | while(true) { |
2 | zeichen = recive(); |
3 | |
4 | switch (state) |
5 | case 0: |
6 | if (zeichen == 0xAA) |
7 | state = 1 |
8 | break |
9 | |
10 | case 1: |
11 | if (zeichen == 0xAA) |
12 | bitergleich(zeichen) |
13 | state = 2 |
14 | else |
15 | state=0 |
16 | break |
17 | case 2: |
18 | savedata(zeichen) |
19 | if (datenende) |
20 | state = 0 |
21 | break; |
22 | } |
ist jezt natürlich pseudocode aber prinzip sollte klar sein. Mist und der Karlheinz war schneller :( wein
Wenn "einschwing" das bedeutet, wie es heißt, d.h. daß das Byte korrumpiert sein kann, dann ist die UART hoffnungslos am Arsch. Für die UART sind nur solche Zeichen zum Synchronisieren erlaubt, die außer dem Startbit keine weiteren 1-0 Flanken enthalten, z.B. 0xF0 ist o.k. Peter
Hallo zusammen, ja die beiden codebsp sind klar und daran hab ich auch gedacht .. nur hab ich das problem, dass direkt das erste zeichen bei der funkübertragung nicht immer zu 100% ankommt und die erste 10101010 als 11101010 erkannt wird .. und da liegt hauptsächlich mein problem. weil dadurch verliere ich ein haufen pakete. der versuchsaufbau ist dafür da die bitfehlerrate der funkstrecke zu testen gruß
Timo wrote: > nur hab ich das problem, dass direkt das erste zeichen bei der > funkübertragung nicht immer zu 100% ankommt und die erste 10101010 als > 11101010 erkannt wird .. und da liegt hauptsächlich mein problem. Ja, das ist ja genau meine Rede. Die UART hat keine Nase, womit sie riechen kann, was die Daten sind. In der Technik muß man immer eindeutige Signale einsetzen. Nimm 0xF0 zur Synchronisation und dann klappts auch. Peter
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.