Hallo, ich möchte an die COM Schnittstelle eine Zeichenfolge schicken, wie z.B. "ab". Und das Programm soll überprüfen, ob "ab" eingegeben wurde. Wie kann ich sowas programmieren? Ichm habe leider nur Funktionen für Eingabe und Ausgabe eines Bytes, aber nicht von einer Zeichenfolge... gibt es schon fertige Bibliotek dafür?
Steht alles hier: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Schreiben_einer_Zeichenkette_.28String.29
Oder hier: www.avrbuch.de / Quellcodes Dort findest du ein einfaches Programm, welches den RS232 Port abfragt, ob ein Befehl eingegangen ist, wenn ja, dann eine Antwort an den PC zurückschickt (je nach Befehl verschieden). Sehr einfach gehalten. LG, Roman Und wie immer auch mein "shameless-plug": Mehr dazu: Im Buch :-) www.avrbuch.de
Danke für den Link auf avrbuch.de. Leider funktioniert bei mir die Funktion uart_getline nicht! Wie muss ich diese Funktion aufrufen und den Buffer deklarieren? Ich habe bis jetzt das so gemacht: In der main() frage ich mit If Abfrage ob etwas zu empfangen ist und gebe die empfangene Zeile sofort aus.
1 | char eingabe[10]; |
2 | |
3 | if ((UCSR0A &(1<<RXC0))) |
4 | {
|
5 | uart_getline(eingabe); |
6 | uart_putline(eingabe); |
7 | }
|
Funktioniert nicht! Was mache ich falsch? Wie muss es richtig sein? Danke!
WorkMännchen wrote:
>
1 | >
|
2 | > char eingabe[10]; |
3 | >
|
4 | > if ((UCSR0A &(1<<RXC0))) |
5 | > { |
6 | > uart_getline(eingabe); |
7 | > uart_putline(eingabe); |
8 | > } |
>
Ich kenn zwar die konkrete uart_getline nicht, aber ich würde schon
mal davon ausgehen, dass die sich selbst um die UART kümmert.
Also
1 | int main() |
2 | {
|
3 | char eingabe[80]; |
4 | |
5 | ....
|
6 | |
7 | // uart initialisieren, Baudrate etc. einstellen
|
8 | |
9 | ...
|
10 | |
11 | while( 1 ) { |
12 | uart_getline( eingabe ); |
13 | uart_putline( eingabe ); |
14 | }
|
15 | }
|
Du kannst natürlich auch deine Bytesende Funktion und Byteempfangsfunktion dafür nutzen, indem du einen Wrapper schreibst. So in der Form:
1 | #include <string.h> |
2 | void sendString(char *str){ |
3 | int sendstrlen, k; |
4 | |
5 | sendstrlen = strlen(str); |
6 | for (k = 0; k < sendstrlen; k++) |
7 | {
|
8 | sendByte(str[k]);//alle bytes raus senden, die im string enthalten sind |
9 | }
|
10 | sendByte('\n');//neue zeile |
11 | sendByte('\r'); |
12 | }
|
Für den Empfang liest du die Bytes in ein Array ein. Falls ich die Frage richtig verstanden hab, is ja schon spät ;-)
Hallo! Sorry für die späte Antwort zur Funktionsweise meiner Funktion. Wie mein Vorposter schon richtig erkannt hat, die Funktion kümmert sich um alles RS232 relevante (also kein: if ((UCSR0A &(1<<RXC0)) notwendig!). Damit die Funktion uart_getline() ein Resultat liefert, muss sie das Zeichen 0x0D empfangen (Carriage Return). Das heißt, im Terminal musst du auf jeden Fall die Enter-Taste drücken, sonst passiert gar nichts. Außerdem hast du nicht erwähnt, ob du am PC überhaupt schon etwas empfangen kannst vom uC? Mach nach der UART initialisierung mal ein "uart_putline("Es funktioniert!!");" und check ob das klappt. Wenn nicht, dann liegt das Problem in der UART Initialisierung. Hast dir die Kommentare durchgelesen am Anfang des rs322.h Files? (1) Vor dem Compilieren, Optimization auf -Os stellen! (2) Unbedingt den PROZESSORTAKT definieren (im Hauptprogramm) (3) Die BAUDRATE wird gleich unterhalb hier festgelegt (4) Bevor die serielle Schnittstelle verwendet werden kann, muss die Funktion "setup_uart()" aufgerufen werden. Es wird in diesem Fall eine Verbindung mit den Parametern 8-N-1 erstellt. Außerdem wird KEIN Interrupt, weder für RX oder TX eingerichtet. Lass uns wissen ob es klappt.
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.