Forum: Mikrocontroller und Digitale Elektronik ersatz für getch() ohne zu warten bis ein char daher kommt


von Christoph M. (chrischu91)


Lesenswert?

Hallo zusammen

Ich habe ein kleines Problem, ich habe ein Programm geschrieben, und 
möchte jetzt eigentlich die ASCII-Zeichen via RS232 vom PC her auf den 
PIC18F46K20 übertragen zur Weiterverarbeitung. Momentan nehme ich noch 
a=getch(); nur das problem an dieser funktion ist, dass sie wartet bis 
ein Char dahergeflogen kommt. Ich habe die Funktion nirgns gewunden, und 
weiss nicht genau was sie macht. Ich möchte eigentlich dass nur dann ein 
Char eingelesen wird, wenn einer daher kommt, und ich sonnst durch das 
Programm rattern kann, also dan Asciiwert in einen buffer in einem 
Interrupt abspeichern kann und dann holen kann wenn ich wieder 
vorbeikomme. Wie kann ich das ermöglichen?

Zusammengefasst: Ich suche einen ersatz für getch(); der nicht wartet, 
bis ein char via Terminal daher kommt.

Ich habe schon überall gesucht, aber keine Antwort gefunden, benutze das 
MPLAB IDE v8.63 in der C sprache.

Ich danke schon im voraus für eine Antwort :)
Grüsse Christoph

von Dietmar (Gast)


Lesenswert?

Wenn du das für den PC brauchst wäre folgende Lösung vieleicht etwas:

if( kbhit() ) a=getch();

kbhit() "überwacht" dabei ob eien Taste gedrückt wurde. War dem so wird 
der dir bekannte getch() ausgeführt.

Gruß Dietmar

von Thomas K (Gast)


Lesenswert?

Hallo!

Aber nur wenn mit PC du DOS/Windows bzw. VC meinst.
kbhit ist nicht Teil von ANSI-C.

#include <termios.h>

int kbhit(void);

int kbhit(void) {

   struct termios term, oterm;

   int fd = 0;

   int c = 0;

   tcgetattr(fd, &oterm);

   memcpy(&term, &oterm, sizeof(term));

   term.c_lflag = term.c_lflag & (!ICANON);

   term.c_cc[VMIN] = 0;

   term.c_cc[VTIME] = 1;

   tcsetattr(fd, TCSANOW, &term);

   c = getchar();

   tcsetattr(fd, TCSANOW, &oterm);

   if (c != -1)

   ungetc(c, stdin);

   return ((c != -1) ? 1 : 0);

}

Gruss
Th

von Thomas K (Gast)


Lesenswert?

getch könnte so implementiert sein:

int getch();

int getch()

{

   static int ch = -1, fd = 0;

   struct termios neu, alt;

   fd = fileno(stdin);

   tcgetattr(fd, &alt);

   neu = alt;

   neu.c_lflag &= ~(ICANON|ECHO);

   tcsetattr(fd, TCSANOW, &neu);

   ch = getchar();

   tcsetattr(fd, TCSANOW, &alt);

   return ch;

}

von Christoph M. (chrischu91)


Lesenswert?

danke werde es mal ausprobieren :) aber sieht schon recht gut aus, dass 
es funktionieren wird

MFG Christoph

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.