2014年4月15日 星期二

兩個device 利用 Uart 傳輸當中所必須注意到的問題

玩嵌入式系統當中,最一開始就要先解決傳輸問題,而最常見的就是將兩個device透過uart傳輸,傳輸過程中必須要注意一個小部份,就是"\n"換行符號,


假設說有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)刷新標準輸出緩衝區,把輸出緩衝區裡的東西打印到標準輸出設備上。



沒有留言:

張貼留言