指定された時間後にタイムアウトするようなgetc()は作れますか?

GETCは常にキャラクタを取得するまで待ちます。 キャラクタの準備ができるまで、getc()をコールしないことが賢明です。kbhit()によりキャラクタの準備が完了したことを調べることができます。以下は、RS232からキャラクタを受信するときのタイムアウト処理例です。ハードウェアUARTを使わない場合は、delay_usは1bit分のパルス幅の1/10より小さくしてください(9600ボーで10us)。ハードウェアUARTを使う場合は1bit分のパルス幅の10倍まで設定することが可能です(9600ボーで1000us)。 もし、65535以上のタイムアウト値が必要な場合は、2つのカウンタを使用します。

	short timeout_error;

	char timed_getc() {
		long timeout;

		timeout_error=FALSE;
		timeout=0;
		while(!kbhit&&(++timeout<50000)) // 1/2 second
			delay_us(10);
		if(kbhit())
			return(getc());
		else {
			timeout_error=TRUE;
			return(0);
		}
}