mikrocontroller.net

Forum: Compiler & IDEs RS232 Eingabe


Autor: WorkMännchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Frank Jonischkies (frajo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Roman Mittermayr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: WorkMännchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

char eingabe[10];

if ((UCSR0A &(1<<RXC0))) 
{
   uart_getline(eingabe);
   uart_putline(eingabe);
}

Funktioniert nicht! Was mache ich falsch? Wie muss es richtig sein?

Danke!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
WorkMännchen wrote:

>
> 
> char eingabe[10];
> 
> if ((UCSR0A &(1<<RXC0)))
> {
>    uart_getline(eingabe);
>    uart_putline(eingabe);
> }
>

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
int main()
{
  char eingabe[80];

  ....

  // uart initialisieren, Baudrate etc. einstellen

  ...

  while( 1 ) {
    uart_getline( eingabe );
    uart_putline( eingabe );
  }
}

Autor: Icke Muster (Firma: my-solution) (hendi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst natürlich auch deine Bytesende Funktion und 
Byteempfangsfunktion dafür nutzen, indem du einen Wrapper schreibst. So 
in der Form:
#include <string.h>
void sendString(char *str){
int sendstrlen, k;

sendstrlen = strlen(str);
for (k = 0; k < sendstrlen; k++)
{
sendByte(str[k]);//alle bytes raus senden, die im string enthalten sind
}
sendByte('\n');//neue zeile
sendByte('\r');
}   
Für den Empfang liest du die Bytes in ein Array ein. Falls ich die Frage 
richtig verstanden hab, is ja schon spät ;-)

Autor: Roman Mittermayr (Firma: www.avrbuch.de) (romanmittermayr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.