我試圖從通過UART連接到MCU的傳感器讀取數據。通電時,傳感器連續輸出一個ASCII大寫字母「R」,後跟四個ASCII字符數字,以毫米爲單位表示距離,然後是回車符(ASCII 13)。c通過UART讀取傳感器的編程邏輯
我想知道是否有人能幫我找出一個邏輯讀取9999作爲一個變量稱爲閱讀。
我應該使用阻塞函數還是非阻塞函數,以及如果數據流入時如何隔離字符?
我試圖從通過UART連接到MCU的傳感器讀取數據。通電時,傳感器連續輸出一個ASCII大寫字母「R」,後跟四個ASCII字符數字,以毫米爲單位表示距離,然後是回車符(ASCII 13)。c通過UART讀取傳感器的編程邏輯
我想知道是否有人能幫我找出一個邏輯讀取9999作爲一個變量稱爲閱讀。
我應該使用阻塞函數還是非阻塞函數,以及如果數據流入時如何隔離字符?
首先,我會去與阻止版本。我想你可能會在開始時預期缺少字符,因爲在你實際讀取數據之前,傳感器可能開始流式字符。所以如果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
結束。
建議'if(offset
@Aif感謝您的幫助 - 快速問題 - 'seen_r'設置爲1的位置 - 輸入第一個if循環? c中還有'next'關鍵字嗎? – gatherriver
你是對的,糾正。謝謝@chux。 – Aif
你認爲你應該使用什麼? –
阻塞意味着函數不會返回,直到一個字符到達。非阻塞意味着它會返回一個角色是否可用(並且它會讓你知道是否有)。無論你想要阻塞還是非阻塞取決於你的邏輯其餘部分,所以你必須自己回答。 – lurker