Forum: Compiler & IDEs USART Kommandointerpreter


von Dennis H. (somebuddy)


Lesenswert?

Guten Abend

Und zwar geht es  um USART Kommunikation.

Ich möchte über diese Schnittstelle zwei Atmegas miteinander 
kommunizieren lassen.

1. Das Webmodule von Ulrich Radig  2. ein weiterer Atmega644

Wenn ich mich mit Putty seriell mit dem Webmodule verbinde und ich Dort 
z.B. dir oder ? eingebe, dann führt er den Befehl aus.

Wenn ich allerdings mit dem zweiten Atmega an das Webmodule senden 
möchte :

uart_puts("dir");

passiert erstmal garnichts.

mit ("dir\r"); kommt ein ERROR zurück als würde er den Befehl nicht 
finden.

Was könnte falsch laufen ?

Manuell: Befehl + Enter  funktioniert.
Atmega : usart_puts("Befehl\r")   ERROR


Sicher wieder nur ein Denkfehler irgendwo.

Hoffe auf eure Hilfe !

Grüße

von blubb (Gast)


Lesenswert?

Ohne Quelltext wird das eine lustige Raterei. Mein Tipp: Statt \r 
vielleicht mal \n probieren oder \r\n oder so...

von Michael L. (michaelx)


Lesenswert?

Hallo Dennis,

vlt. mal mit \x0d bzw. \x0d + \x0a versuchen.

Oder mal in die Quellen vom Herrn Radig schauen ...

In Bereichen, wo es auf die Interpretation von Steuerzeichen ankommt, 
habe ich mir angewöhnt, immer deren Hexcodes zu verwenden, und mich 
nicht auf die Interpretation dieser Escapesequenzen zu verlassen. Gerade 
\n ist für unterschiedliche Umsetzung auf verschiedenen Plattformen 
"verrufen", und ich durfte miterleben, wie Kollegen darüber schwer 
gestolpert sind.

Grüße.

von blubb (Gast)


Lesenswert?

Ist in der Tat furchtbar. Ich kann mir auch nie merken, ob /n/r oder 
/r/n
Windows ist so, Mac ist so, Linux wieder anders.

von Dennis H. (somebuddy)


Lesenswert?

Okay.. ich hole etwas weiter aus.
Vielen dank schonmal für eure Anregungen.

Es geht im Prinzip darum von der Zusatzplatine ein Signal zu senden.
In deren Interrupt Routine ( Taster an INT0 ) habe ich mit Hilfe der 
Uart Lib von P.Fleury folgendes stehen:
1
 
2
ISR(INT0_vect)
3
{
4
  cli();
5
  EIMSK &= ~(1<< INT0); // INT0 deaktivieren
6
  sei();
7
  lcd_clrscr();
8
  lcd_command(1<<LCD_HOME);
9
  lcd_puts("Karte erkannt!");
10
  uart_puts("SAVE");
11
  uart_puts("\r");
12
13
  //uart_puts("SAVE\r");
14
  //uart_putc(0x04);
15
16
  //lesen();
17
18
  //startbild();
19
  cli();
20
  EIMSK |= (1<< INT0); // INT0 aktivieren
21
22
  EIFR |=  (1<<INTF0); //Interruptflag INT0 löschen
23
  sei();
24
}


Wie man an den Kommentaren sieht habe ich auch schon versucht nach 
uart_puts() via uart_putc(HEXWERT) die Steuerzeichen manuell zu senden.


Sowohl für /n , /r als auch für 0x85.

http://de.wikipedia.org/wiki/Steuerzeichen


Wie der Kommandointerpreter auf der Webmodule Seite ausschaut 
,durchblicke ich leider nicht zu 100% da eine Handeingabe funktioniert 
muss ich allerdings ja "nur":

[BEFEHLEINGABE + ENTER] emulieren.

Via Putty funktioniert es ja wie es soll.

Die Befehlsauswertung im Webmodule findet im Webmodule in der While(1) 
Schleife statt. Er liest also jedesmal aus dem UART Puffer ob er einen 
Befehl findet.
1
//Terminalcommandos auswerten
2
    if (usart_status.usart_ready){
3
            usart_write("\r\n");
4
      if(extract_cmd(&usart_rx_buffer[0]))
5
      {
6
      #if USE_MMC
7
        usart_write("\r\nSD:%s>",cwdirectory);
8
      #else
9
        usart_write("Ready\r\n\r\n");
10
      #endif
11
      }
12
      else
13
      {
14
        usart_write("ERROR\r\n\r\n");
15
      }
16
      PORTD ^= (1<<PD6);
17
      usart_status.usart_ready =0;
18
    }

Folgendes steht in der Beschreibung der Main.c im Webmodule.
1
 *  Als erstes wird in der Hauptschleife die Zeit hochgezählt. Der Timerinterrupt
2
   *  zählt nur das Flag #PROZESS_STATUS.timeChanged. Dadurch ist es möglich bei Erreichen
3
   *  einer vorgegebenen Schaltzeit auch längere Aktionen auszuführen ohne auf Dauer eine
4
   *  Gangungenauigkeit zu riskieren. Die zwischenzeitlich vergangenen Sekunden werden
5
   *  notfalls einzeln in den nächten Schleifendurchgängen beschleunigt nachgeholt.
6
   *
7
   *  Danach werden gesetzte Flags einzeln abgefragt, eine entsprechende Funktion zum
8
   *  Ausführen der Aktion aufgerufen und das Flag wieder zurückgesetzt.
9
   *
10
   *  Regelmäßig wird dabei 
11
   *  - die Ethernetschnittstelle mit #eth_get_data() gepollt;
12
   *  - die serielle Schnittstelle auf Ende des
13
   *    Befehls abgefragt #usart_status.usart_ready
14
   *  - bei TELNET-Verbindung auf Port 23 werden Zeichen
15
   *    von USART->TCP geschickt <tt>telnetd_send_data();</tt>
16
   *
17
   */

Dabei verstehe ich leider nicht was es mit dem usart_ready flag auf sich 
hat. Da dieser ja auch in dem Kommandointerpreter eine Rolle spielt.


Vielen Dank und frohe Weihnachten !

von Dennis H. (somebuddy)


Angehängte Dateien:

Lesenswert?

Anbei nochmal ein Mitschnitt meines LA, der mich etwas verwirrt.

Man sieht ,dass das SAVE gesendet wird und er nach dem ersten CR schon 
mit der Verarbeitung anfängt und mit ERROR antwortet.

Das ECHO des Empfangenen ERROR kann ich mir gerade aber nicht erklären.
Ist in der UART Lib von Fleury ein ECHO eingebaut ? weiss das jemand ? 
konnte in den Defines nichts finden.

von Karl H. (kbuchegg)


Lesenswert?

Wenn wir mal Ulrich Radigs Code zu Grunde legen, dann steht da zb
1
        usart_write("Ready\r\n\r\n");

er macht also seine Zeilenumbrüche mit \r\n

ALso könntest du mal versuchen, deine eigenen Kommandos ebenfalls mit 
\r\n als Zeilentrenner zu versehen
1
  uart_puts("SAVE\r\n");


einfach mal analog vorgehen.

von Dennis H. (somebuddy)


Lesenswert?

So..

nach entfernen des "ECHO" funktioniert es nun zumindest bei jedem 
"zweiten" mal mit diesem Befehl :  uart_puts("SAVE\r");

Es scheint also als müsste ich den Empfänger erstmal in einen 
definierten Zustand versetzten.

Welcher das ist und wie ich das anstelle , weiss ich allerdings noch 
nicht.

Der Empfänger ist von "Hause aus" eben auch auf Tastatureingaben 
ausgelegt und nicht auf Steuerung.

von Dennis H. (somebuddy)


Angehängte Dateien:

Lesenswert?

Karl Heinz Buchegger schrieb:
> ALso könntest du mal versuchen, deine eigenen Kommandos ebenfalls mit
> \r\n als Zeilentrenner zu versehen
>   uart_puts("SAVE\r\n");

nach dem einfügen von \n funktioniert es nun "scheinbar" jedesmal.

Ich weiß allerdings nicht wieso , da ich \r\n auch schon vorher versucht 
habe. Allerdings vor entfernen des "Echo".
Kann es nur daran gelegen haben ? Die Befehlsverarbeitung kam doch vor 
dem Echo.

Anbei nochmal ein Bild der aktuellen Kommunikation.

Vielen Dank ! Kann es mir zwar noch nicht erklären , aber immerhin einen 
Schritt weiter.

Edit:

Sagt das Bild nicht eigentlich ,dass das letzte LF misachtet wird und 
somit "egal" sein müsste ?

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
Noch kein Account? Hier anmelden.