Hallo, Habe mir den RFID-Reader Bausatz von Pollin gekauft. Dieser läuft einwandfrei mit einem ATmega8 und der Software von proektsammlung.de. Habe den Code so modifiziert das beim Start der String "0000000000" (als Init) über die UART ausgegeben wird und bei jedem gelesenen Tag die Daten Dezimal gesendet werden. Auf der Empfänger Seite sitzt ein ATmega32. Hier habe ich die UART-Lib von Peter Fleury am laufen (http://homepage.hispeed.ch/peterfleury/group__pfleury__uart.html). Diese funktioniert auch soweit perfekt. Mein Ziel ist es nun die ankommenden Daten vom gelesenen Tag zu speichern und darauf zu reagieren. Außerdem werden die Daten wieder weiter an den PC gesendet. Meine Lösung ist leider weder Schön noch Platz sparend noch fehler frei... (s. Anhang) Meine Probleme: - Manche Tags werden nicht vollständig wieder weiter gesendet. - Ich hätte das ganze gern in EINER Variable stehen stehen, dies wäre einfacher zum späteren Vergleichen und übersichtlicher. Hatt hierfür jemand ein Tipp für mich, oder vllt. einen komplett anderen Lösungsansatz? Danke und Gruß!
Hallo, Danke für den Tipp! Habe es hinbekommen das der gelesene Tag in einem Array gespeichert wird. Allerdings habe ich immer noch Probleme beim einlesen der Daten. Beim ersten einlesen klappt noch alles Perfekt... die darauf folgenden werden dann unvollständig oder als Hieroglyphen gesendet. Bin für jeden Tipp dankbar! Gruß
Hat keiner einen Tipp für mich? Habe auch heute wieder weiter experimentiert, aber es ändert sich einfach nichts an dem, was im Terminal aufm PC raus kommt...
Dauern so Sachen wie:
>uart_puts_P("Buffer overflow error: ");
evtl. zu lang um neue Daten zu verarbeiten?
viel Erfolg
Hauspapa
Danke für die Antwort! Auch wenn ich das alles weg lasse:
1 | if ( data & UART_FRAME_ERROR ) |
2 | {
|
3 | uart_puts_P("UART Frame Error: "); |
4 | }
|
5 | |
6 | if ( data & UART_OVERRUN_ERROR ) |
7 | {
|
8 | uart_puts_P("UART Overrun Error: "); |
9 | }
|
10 | |
11 | if ( data & UART_BUFFER_OVERFLOW ) |
12 | {
|
13 | uart_puts_P("Buffer overflow error: "); |
14 | }
|
Ändert sich nichts. Auch ausschalten der Globalen Interrupts während dem auslesen hilft nicht. Wie könnte ich die UART schöner/schneller auslesen? Lg Marvin
Marvin Hartmann schrieb: > Ändert sich nichts. Auch ausschalten der Globalen Interrupts während dem > auslesen hilft nicht. Wie könnte ich die UART schöner/schneller > auslesen? Gar nicht. DIe Fleury Lib ist schon ziemlich gut. Besser kriegst du das auch nicht hin. Und lass die Interrupts eingeschaltet. Die auszuschalten ist komplett kontraproduktiv.
hauspapa schrieb: > Dauern so Sachen wie: >>uart_puts_P("Buffer overflow error: "); > evtl. zu lang um neue Daten zu verarbeiten? solange dieser Fehlerfall nicht eintritt, ist das völlig wurscht.
>Auch wenn ich das alles weg lasse: Das hier wirst Du wohl nicht weglassen können: >if(comp == 1) > { > uart_putc(bit1); > uart_putc(bit2); > uart_putc(bit3); > uart_putc(bit4); > uart_putc(bit5); > uart_putc(bit6); > uart_putc(bit7); > uart_putc(bit8); > uart_putc(bit9); > uart_putc(bit10); > } und braucht auch seine Zeit. Wenn Du am Gesamtkonzept nicht zu viel ändern möchtest, hilft evtl. gelegentlich > data = uart_getc(); auszuführen und in einen Puffer zu schreiben. z.B. nach jedem >uart_putc(...); keine Garatie auf Sinnhaftigkeit, bin mehr der Hardware zugewandt. Hauspapa
Probier mal folgendes. Mit deinen ganzen Hilfsvariablen und Flags wird man ja ganz schwummerig, wenn man im Code verfolgen soll, wann welches Flag auf 1 oder 0 geht und damit welche andere Aktion auslöst. Muss jan nicht sein, dass das alles so kompliziert ist :-)
1 | int main(void) |
2 | {
|
3 | unsigned int data; |
4 | unsigned char tag[10]; |
5 | uint8_t tagCnt; |
6 | uint8_t i; |
7 | |
8 | lcd_graphics_init(); // Display initialisieren |
9 | lcd_graphics_clear(); // Display löschen |
10 | g_draw_main_menu(); // Hauptmenü zeichnen |
11 | |
12 | uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); // UART starten (baud) |
13 | |
14 | |
15 | tagCnt = 0; |
16 | |
17 | sei(); //Globale Interrupts akt. |
18 | |
19 | for(;;) |
20 | {
|
21 | data = uart_getc(); |
22 | if ( !(data & UART_NO_DATA) ) |
23 | {
|
24 | tag[tagCnt] = data; |
25 | tagCnt++; |
26 | |
27 | if( tagCnt == 10 ) |
28 | {
|
29 | for( i = 0; i < 10; i++ ) |
30 | uart_putc( tag[i] ); |
31 | uart_putc( ' ' ); |
32 | |
33 | tagCnt = 0; |
34 | }
|
35 | }
|
36 | }
|
37 | }
|
Karl Heinz schrieb: > Und lass die Interrupts eingeschaltet. Die auszuschalten ist komplett > kontraproduktiv. Das hab ich mir fast gedacht... Mit: > Wie könnte ich die UART schöner/schneller > auslesen? meinte ich die Art wie ich die Daten mit
1 | uart_getc(); |
hole zu verbessern, nicht die Funktion der Lib. ;) Karl Heinz schrieb: > hauspapa schrieb: >> Dauern so Sachen wie: >>>uart_puts_P("Buffer overflow error: "); >> evtl. zu lang um neue Daten zu verarbeiten? > > solange dieser Fehlerfall nicht eintritt, ist das völlig wurscht. Ok, dann werd ich das lassen wie es ist. @hauspapa Ich ändere gerne das Gesamtkonzept damits am Ende dann auch läuft :) Karl Heinz schrieb: > Mit deinen ganzen Hilfsvariablen und Flags wird man ja ganz schwummerig, > wenn man im Code verfolgen soll, wann welches Flag auf 1 oder 0 geht und > damit welche andere Aktion auslöst. Muss jan nicht sein, dass das alles > so kompliziert ist :-) Bin in C noch nicht so lange unterwegs :/ Danke für den Code, er macht das ganze schon ziemlich übersichtlich. Allerdings mit dem gleichen Ergebniss :( (s. Bild) Lg
Marvin Hartmann schrieb: > das ganze schon ziemlich übersichtlich. Allerdings mit dem gleichen > Ergebniss :( (s. Bild) Na ja. Das kann aber ein Blinder greifen, dass die RFID Leser eben nicht 10 Character schickt, sondern ein paar mehr und nach dem eigentlichen Tag noch irgendwelche Zusatzinformation geliefert wird. Aus der Position des Leerzeichens und wie es wandert, kann ich ablesen, dass da 2 Bytes noch hinten drann kommen. Ich schätze mal der Reader wird da wohl ein CR und LF noch hinten nach schieben, was auch vernünftig wäre um anzuzeigen: jetzt ist der Tag zu ende. Aber sieh mal zu, dass du die Bytes in Hex-Form siehst. Ich würde fast wetten, dass du hier ein 0x0D und ein 0x0A sieht.
:
Bearbeitet durch User
Hier ein Bild der Daten im Hex-Format. Werde morgen mal versuchen den Reader umzuprogrammieren das nur noch der Tag gesendet wird. Danke schonmal jetzt, lg Marvin
Marvin Hartmann schrieb: > Hier ein Bild der Daten im Hex-Format. Werde morgen mal versuchen den > Reader umzuprogrammieren das nur noch der Tag gesendet wird. Nein. Falsch. Wenn du den Tag sowieso weiter sendest, dann willst du diesen Zeilenvorschub eigentlich haben. Denn er trennt dir einen Tag vom nächsten. Willst du die Tags auf dem AVR bearbeiten: so schwer ist das jetzt auch wieder nicht, die 0x0D bzw. 0x0A auszufilter. Das ist eine Standardübung für jeden, der eine Eingabezeile von irgendwoher einliest: solange Zeichen sammeln, bis ein Trennzeichen daher kommt oder das Array voll ist. Ein bischen was muss man schon im VOrfeld auch können, ehe man sich an ein Projekt wagt. Sorry, aber das musste jetzt sein, denn ich kann dieses "ich kann C nicht" ehrlich gesagt nicht mehr hören (zumal das alles mit C eigentlich recht wenig zu tun hat. Das ist stink normale Programmlogik)
:
Bearbeitet durch User
Problem erkannt - Problem gebannt! Vielen Dank für eure Hilfe, habs hin bekommen! :-) Gruß Marvin -CLOSED-
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.