2015-06-20 74 views
0

我想用「握手」的方法讀取6個數據傳感器從arduino到VC++,我發送「1」給arduino,然後這個設備將數據發送到PC。 我的數據格式爲: &data0,data1,data2,data3,data4,data5%不完整的讀數據串口

但是,當我總是VC++數據不完整的讀它,甚至認爲緩衝區的大小足以讓所有的數據

這裏是我的VC++程序的快照,我把它在計時器事件

DWORD nbytes; 
    char buffer[24]; 

    //Read Sensors 

    if(!WriteFile(hnd_serial, "1", 1, &nbytes, NULL)){KillTimer(cTimer1);MessageBox(L"Write Com Port fail!");return;} 
    Sleep(5); 
    if(!ReadFile(hnd_serial, buffer, 23, &nbytes, NULL)){KillTimer(cTimer1);MessageBox(L"Read Com Port fail!");return;} 
    Sleep(50); 

我改變了波特率,但結果仍然相同。 但如果我減少一個數據,如data5(成爲5個傳感器),數據就完成了。 我的程序有問題嗎?

+0

你檢查了arduino接收「1」嗎? –

+0

是的arduino正在接收1,併發送數據,但數據不完整(最後3位數據) – Limavolt

+0

每個數據有多少字節? (data0,data1,..) –

回答

0

你可以把你的ReadFile()函數放在一個do-while循環中。

do{ 
    if(!ReadFile(hnd_serial, buffer, 23, &nbytes, NULL)){ 
     //Process error 
     break; 
    } 
    if (nbytes>= 6) 
    { 
     //Put your flag - or process here 
     break; 
    } 
}while(nbytes); 

的ReadFile的()只返回當前緩衝狀態,也不會等到收到完整的預期數據

+0

謝謝,但讀取的緩衝區永遠不會達到數據結束(%)。可能是因爲串口的「緩衝區」有限。 – Limavolt

+0

您可以嘗試在調用ReadFile之前放置一個延遲1s計時器來檢查這種情況 –

0

你不說什麼波特率你正在使用的。

你也不會說什麼,如果有的話,接收超時設置。

假設它是9600,表示端口每秒傳輸960字節。所以每個字節僅超過1毫秒。

如果你的睡眠(5)應該等待發送「1」並且數據返回,那麼你應該等待足夠長的時間來傳輸所有的字節。假設超時被設置,以便ReadFile立即返回RX緩衝區中的任何字節,那麼你有可能讀得太快。

嘗試更大的延遲。