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
Ohne Quelltext wird das eine lustige Raterei. Mein Tipp: Statt \r vielleicht mal \n probieren oder \r\n oder so...
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.
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.
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 !
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.