Forum: Compiler & IDEs RS232 Eingabe


von WorkMännchen (Gast)


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?

von Frank J. (frajo)


Lesenswert?


von Roman Mittermayr (Gast)


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

von WorkMännchen (Gast)


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.
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!

von Karl H. (kbuchegg)


Lesenswert?

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
}

von Icke M. (Firma: my-solution) (hendi)


Lesenswert?

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 ;-)

von Roman M. (Firma: www.avrbuch.de) (romanmittermayr)


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.

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.