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...
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
intmain(void)
2
{
3
unsignedintdata;
4
unsignedchartag[10];
5
uint8_ttagCnt;
6
uint8_ti;
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)
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.
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)
Eine eigene Frage?
Dieser Thread ist über 12 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.