Hallo Ist es mit einfachen Mitteln möglich bei einem AVR und über UART angeschlossenen PC Befehle zu senden, zum Beispiel um Register zu setzen bzw abzufragen? Gruß Chaos
Ja. Sicher. Mit einem Protokoll. Das ist eine Verfahrensweise wie man gesendete Daten auswertet.
Ja. Spass beiseite. Bemüht mann gooooogle oder die forensuche findet man hier einiges. Sogar im GCC-Tutorial für den AVR im bereich UART findet man entsprechende links. das einfachste ist, einfach das signal SIG_UART_RECV auswerten. bzw ne FIFO oder nen Puffer bauen.
1 | |
2 | |
3 | #define BUFLEN 128
|
4 | volatile unsigned char buffer[BUFLEN]; |
5 | volatile unsigned char rx_ptr = 0; |
6 | |
7 | SIGNAL(SIG_UART_RECV) |
8 | {
|
9 | buffer[rx_ptr] = UDR; |
10 | if (++rx_ptr >= BUFLEN) rx_ptr = 0; |
11 | }
|
Du definierstt dir einen Puffer, jedesmal, wenn die UART ein Zeichen empfängt, hängst du es an den puffer an und inkrementierst den Schreibzeiger. Am besten Pollst du nun oder, wenns nicht zu Komplex ist, bastelst du die Auswertung in die SIGNAL ISR mit rein. Pollen kommt aber IMHO (wirklich nur meine meinung!) am besten. Du prüfst nun, ob das zeichen rx_ptr-- == \n (oder was immer du als "kommando vollständig" haben möchtest) ist. wenn dies so ist, wertest du den Inhalt (abzgl. \n) aus und setzt rx_ptr wieder auf 0. d.h.
1 | void main() |
2 | {
|
3 | unsigned char temp_buf [BUFLEN]; |
4 | while(1) |
5 | {
|
6 | // Do some fancy stuff
|
7 | if (buffer[rx_ptr-1] == '\n') |
8 | {
|
9 | // Kopiere buffer in temp_buf, damit ein erneutes SIGNAL dir den buf nicht zerschießt
|
10 | // werte temp_buf aus. nen anhaltspunkt ist ein switch()case-Konstrukt
|
11 | }
|
12 | }
|
ich denke, so in etwa müsste es klappen. ich arbeite zwar beruflich viel mit c/c++, aber in der uC-Welt bin ich noch nicht allzulange zu hause. wie gesagt. das meiste findet man bei google......
Bastinator schrieb: > das einfachste ist, einfach das signal SIG_UART_RECV auswerten. > bzw ne FIFO oder nen Puffer bauen. Das ist schon gar nicht mal so verkehrt. > // Do some fancy stuff > if (buffer[rx_ptr-1] == '\n') > { Das geht aber mit Sicherheit schief. Schlag ihm keinen Ringbuffer vor, wenn du ihn noch nicht beherrscht. Ein stinknormaler linearer Buffer in dem Zeichen bis zum '\n' gesammelt werden (in der ISR) tuts fürs erste auch und ist für den TO leichter zu beherrschen.
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.