Hallo Gemeinde,
ich hab da mal ein Problem, bei dem ich langsam verzweifle.
Ich möchte einen Komandoparser in meinen Mega32 bauen und dazu zunächst
einmal einen String über die ser. Schnittstelle einlesen. Ich verwende
Peter Fleury's uart.c um die Daten zu senden bzw zu empfangen.
Da in seiner Lib keine funktion enthalten ist um Strings zu lesen habe
ich folgende Routine hinzugefügt:
1 | #include <stdio.h>
|
2 | #include <stdlib.h>
|
3 | #include <string.h>
|
4 | #include <avr/io.h>
|
5 | #include <avr/interrupt.h>
|
6 | #include <avr/pgmspace.h>
|
7 |
|
8 | #include "uart.h"
|
9 |
|
10 | /* define CPU frequency in Mhz here if not defined in Makefile */
|
11 | #ifndef F_CPU
|
12 | #define F_CPU 16000000UL
|
13 | #endif
|
14 |
|
15 | /* 38400 baud */
|
16 | #define UART_BAUD_RATE 38400
|
17 |
|
18 |
|
19 | void uart_gets( char* Input )
|
20 | {
|
21 | char c = uart_getc();
|
22 | uart_putc( c ); // und gleich wieder zurückschicken, damit
|
23 | // der Benutzer auch was sieht
|
24 |
|
25 | while( c != '\r' ) {
|
26 | *Input = c;
|
27 | Input++;
|
28 | c = uart_getc();
|
29 | uart_putc( c );
|
30 | }
|
31 | *Input = '\0';
|
32 | }
|
33 |
|
34 | int main()
|
35 | {
|
36 |
|
37 | uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
|
38 |
|
39 | sei();
|
40 |
|
41 | uart_puts("Hier geht es los\r\n>>");
|
42 |
|
43 | char Buffer[50];
|
44 |
|
45 | while( 1 ) {
|
46 |
|
47 | uart_gets( Buffer, 50); // Auf eine Zeile vom Benutzer warten
|
48 |
|
49 | //
|
50 | // Testweise die komplette Zeile zurückschicken, so wie
|
51 | // sie vom µC empfangen wurde
|
52 | //
|
53 | uart_puts( "Ich habe verstanden : " );
|
54 | uart_puts( Buffer );
|
55 | uart_putc( '\n' );
|
56 |
|
57 | // war die Eingabe vom Benutzer der Text 'Test'
|
58 | if( strcmp( Buffer, "Test" ) == 0 ) {
|
59 | // Wenn ja, dann begrüsse ihn
|
60 | uart_puts( "Hallo Test\n" );
|
61 | uart_puts( "Wie gehts\n" );
|
62 | }
|
63 | }
|
64 | }
|
Leider funktioniert das nicht so wie gedacht sondern es passieren zwei
Dinge:
1. der Prompt wird angezeigt:
Hier gehts los
>>
2. bei der Eingabe werden die Buchstaben im Terminalfenster ausgegeben.
Wenn ich Enter drücke springt die Anzeige an den Anfang der Zeile. Aber
es wird nichts ausgegeben.
3. Wenn ich erneut Buchstaben eingebe werden diese wieder im Terminal
dargestellt. Wenn ich dann zum zweiten Mal Enter drücke scheint sich der
Controller zu reseten, denn ich bekomme wieder den Prompt
Hier geht es los
>>
angezeigt.
Kann mir mal einer einen Tipp geben, was ich da ggf. falsch mache?
Es macht übrigens auch keinen untershcied, ob ich mit Int arbeite
(welches in der lib ja im oberen Byte eventuelle Fehler anzeigt) und den
unteren Teil für den String nutze oder ob ich (wie oben) direkt mit char
arbeite.
Gruß
mws