2014-10-09 105 views
2

我有一個函數,當UART緩衝區非空時從UART設備獲取字符。C - 從uint8_t函數返回失敗

uint8_t getByte(void) { 
    while(!uartCharsAvail(uartBase)) { 
     // Wait for a character to become available 
    } 
    return uartGetChar(uartBase); 
} 

現在的問題是我想介紹一個超時,以便該函數在等待時間過長時會返回一個失敗。

uint32_t replyTimeout; 
uint8_t getByte(void) { 
    replyTimeout = 0; 
    while(!uartCharsAvail(uartBase)) { 
     // Wait for a character to become available 
     if (replyTimeout++ > MAX_REPLY_TIME) { 
      return -1; 
     } 
     delay(1); 
    } 
    return uartGetChar(uartBase); 
} 

這裏的問題當然是我從uint8_t函數返回負數。

有沒有一種簡單的方法來解決這一問題?我能想到的唯一方法就是使函數boolean並傳遞一個uint8_t指針作爲參數。

+5

是的,像所有C單字節輸入/處理函數一樣:使用int,所有成功的返回值都是非負數。 – Deduplicator 2014-10-09 20:32:38

+0

我建議使用時鐘週期,而不是增加一個變量來衡量超時。例如clock()因爲使用變量不是很準確,它有時可能運行得更快或更慢。 – 2014-10-09 20:41:36

回答

2

就像int fgetc()一樣,使用負值(如EOF)表示文件結束(串口不再可用)或IO錯誤(例如超時)。

隨着數據的返回,使用0到255不會與EOF相沖突。

關鍵是getByte()需要返回257個不同的東西(256個不同的字節和超時)。 uint8_t缺乏這個範圍。

+0

我不知道我在哪裏可以找到'fgetc()'的定義,但我認爲它可以將'uint8_t getByte()'更改爲'int getByte()',它會按照寫入的方式工作? – user3817250 2014-10-10 13:43:36

+0

@ user3817250是的。順便說一句:谷歌「fgetc c」。 – chux 2014-10-12 04:40:31

+0

將「fgetc c」放入Google中會產生一堆「如何使用fgetc」類型的東西,但我沒有看到任何具有fgetc定義的東西。 – user3817250 2014-10-14 19:05:15