假設說有device A, device B 而deviceA定義一個thread每一秒就會透過uart訊號傳出去,例如:
void uart_puts(void *p){ while(1){ printf("”Hello Device B"); Delay(1000); } }
而接收方Device B 透過下列程式去接收:
while(1){ do { n = read(fd_uart, (void*)&c, 1); if (n < 0) { perror("Read failed - "); return -1; }else if (n == 0) /*indicates end of file*/ printf("end of file\n"); else{ /*n>0 means have received data.*/ buf[cnt++] = c; } } while(n>0 && cnt<14 && c!='\n'); buf[cnt]='\0'; printf("%d bytes read : %s\n", cnt, buf); cnt = 0; }
若是以上的方式的話,DeviceB的輸出結果並不會如期的一秒鐘顯示一次"Hello Device B",而是過了一段時間才會印出一大堆的"Hello Device B" , 原因是因為在Device A之傳送端中,沒有加上"\n"換行符號,因為對於printf來說他會先輸出到你指定的裝置,但是會先暫存到buffer之中,直到他收到了換行符號,他才會刷新整個buffer,故此程式碼當中,沒有換行符號他就是一直塞buffer,直到緩衝區的大小滿了,才會刷新整個buffer,因此Device B才會一次出現一大堆的資料,只要在Device A中加上換行符號即可。
printf("”Hello Device B\n");
當然你也可以用標準方法,使用fflush函數,強制清空buffer且輸出buffer:
flush(stdin)刷新標準輸入緩衝區,把輸入緩衝區裡的東西丟棄
fflush(stdout)刷新標準輸出緩衝區,把輸出緩衝區裡的東西打印到標準輸出設備上。
沒有留言:
張貼留言