2016-08-01 149 views
-1

我試圖從通過UART連接到MCU的傳感器讀取數據。通電時,傳感器連續輸出一個ASCII大寫字母「R」,後跟四個ASCII字符數字,以毫米爲單位表示距離,然後是回車符(ASCII 13)。c通過UART讀取傳感器的編程邏輯

我想知道是否有人能幫我找出一個邏輯讀取9999作爲一個變量稱爲閱讀。

我應該使用阻塞函數還是非阻塞函數,以及如果數據流入時如何隔離字符?

+1

你認爲你應該使用什麼? –

+0

阻塞意味着函數不會返回,直到一個字符到達。非阻塞意味着它會返回一個角色是否可用(並且它會讓你知道是否有)。無論你想要阻塞還是非阻塞取決於你的邏輯其餘部分,所以你必須自己回答。 – lurker

回答

0

首先,我會去與阻止版本。我想你可能會在開始時預期缺少字符,因爲在你實際讀取數據之前,傳感器可能開始流式字符。所以如果UART充滿,那麼你可能需要它。所以示例代碼是:

#define CR (13) 
uart_t my_uart; // You need to setup this 
uart_status_t status; 
uint8_t c; 
int status; 
char distance[255] = { 0 }; // Whatever, large enough 
int seen_r = 0; // You have not yet seen 'R' 
int offset = 0; 

while ((status = uart_read(my_uart, &c, &status)) == 0) 
{ 
    if (seen_r) 
    { 
     if (c == CR) 
     { 
      printf("Distance: %s\n", distance); 
      seen_r = 0; 
      memset(distance, 0, sizeof(distance)); 
     } 
     if (offset < sizeof(distance)-1) 
     { 
      distance[offset++] = (char)c; 
     } 
     else 
     { 
      printf("Unexpected size, reset!\n"); 
      seen_r = 0; 
      memset(distance, 0, sizeof(distance)); 
     } 
    } 
    else 
    { 
     if (c != 'R') continue; 
     seen_r = 1; 
    } 
} 

當然這是未經測試的代碼,但它可能會給你一些提示。 基本上,你有一個狀態機,以'R'開頭,並以CR結束。

+0

建議'if(offset chux

+0

@Aif感謝您的幫助 - 快速問題 - 'seen_r'設置爲1的位置 - 輸入第一個if循環? c中還有'next'關鍵字嗎? – gatherriver

+1

你是對的,糾正。謝謝@chux。 – Aif