ersatz für getch() ohne zu warten bis ein char daher kommt

OP #2190512
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
Gast #2190520
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
Gast #2190554
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
Gast #2190557
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;

}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren