2012-10-22 36 views
2

首先讀取數據,請參見下面的代碼塊:不斷地從一個串行端口while循環運行

while(1) { 
    lt = time(NULL); 
    ptr = localtime(&lt); 

    int n = read (fd, buf, sizeof(buf)); 
    strftime(str, 100, "%c", ptr); 

    int temp = sprintf(tempCommand, "UPDATE roomtemp SET Temperature='%s' WHERE Date='Today'", buf); 
    temp = sprintf(dateCommand, "UPDATE roomtemp SET Date='%s' WHERE Type='DisplayTemp'", str); 

    printf("%s", buf); 
    mysql_query(conn, tempCommand); 
    mysql_query(conn, dateCommand); 
} 

讀功能實際上是讀取數據從一個串口來英寸它工作的很好,但我遇到的問題(我認爲)是執行循環所需的時間。我有數據每秒發送到串行端口。假設數據是每秒「22」。此循環所做的是在「2222」或有時「222222」中讀取。我認爲正在發生的事情是該循環花費太長的時間來迭代,並導致數據在串行緩衝區中累積。 read語句讀入緩衝區中的所有內容,因此給我重複的值。

有什麼辦法可以解決這個問題嗎?也許在循環結束時,我可以刷新緩衝區。但我不確定我知道如何做到這一點。或者也許有一些方法可以減少循環中的代碼,以便減少每次迭代花費的總時間。我的猜測是,MySQL查詢無論如何都需要最多的時間。

回答

2

首先,您應該檢查read的錯誤,並正確終止收到的「字符串」。

要解決您的問題,有幾種方法可以解決此問題。一種是將讀取來自串行端口或數據庫更新放在單獨的線程中。然後你可以在這些線程之間傳遞「消息」。不過要小心,因爲看起來你的數據庫很慢,而且消息隊列可能會增加。通過設置一個大小爲1的消息隊列可以避免這種消息累積,該消息隊列始終包含最新讀取的溫度。然後你只需要一個溫度讀數線程設置的標誌,數據庫更新線程檢查然後清除。

另一種解決方案是修改用於通信的協議,因此它包含一個數字來表示消息的大小。