回答:
AVRには、RXCとTXCの両方(RXおよびTX完了)の割り込みベクターがあります。必要がない限り、これらをポーリングする必要はありません。
割り込みルーチンはデータをバッファに格納します(書き込みポインタと取得ポインタを備えた循環バッファは適切に機能します)。メインループは、バッファにデータがあるかどうかを確認し、データがある場合はそれを取り出します。メインループは他のこともできますが、割り込みバッファーがオーバーフローする前に(putがgetと出会うときに)データをチェックして削除する必要があります。
コンパイルされませんが、これはメソッドを示しています。
char circ_buf[BUFFER_SIZE];
int get_index, put_index;
void initialize(void) {
get_index = 0;
put_index = 0;
}
isr serial_port_interrupt(void) { // interrupt
circ_buf[put_index++] = SERIAL_PORT_REGISTER;
if(put_index==get_index) error("buffer overflow"); // oops
if(put_index==BUFFER_SIZE) put_index = 0; // circular buffer
}
void background routine(void) {
while(put_index!=get_index) { // or if()
ch = circ_buf[get_index++];
// do something with ch
if(get_index==BUFFER_SIZE) get_index = 0;
}
}