2013-06-01 139 views
0

好的,我遇到了問題。我正在編寫使用微軟飛行模擬器X SDK和Arduino的東西。該應用程序應該通過串行端口將數據發送到Arduino板,和我使用這個功能:串口通信Arduino,C++

http://playground.arduino.cc/Interfacing/CPPWindows

程序完美的作品,除了它突然停止工作。 (1)連續執行一個函數,向模擬器請求數據,然後通過串行發送一個字符串。這就是我所說的功能寫數據的方法:作爲cadena我送字符串

WriteData((char *)cadena.c_str(),8); 

。 功能的寫數據是這樣的:

bool Serial::WriteData(char *buffer, unsigned int nbChar) 
{ 
    DWORD bytesSend; 
    //Try to write the buffer on the Serial port 
    if(!WriteFile(this->hSerial, (void *)buffer, nbChar, &bytesSend, 0)) 
    { 
     //In case it don't work get comm error and return false 
     ClearCommError(this->hSerial, &this->errors, &this->status); 

     return false; 
    } 
    else 
     return true; 
    } 

我已經看到了,如果我評論了整個if-else,因此函數WriteFile不會被調用時,程序不會停止工作,完美的推移(除了事實該信息不會發送給Arduino)。如果該行被執行,程序會在一分鐘左右後停止。而停止我並不意味着崩潰或什麼,我只是說它停止,控制檯仍然在那裏所有的消息,它只是停止工作。

可能會發生什麼?

編輯:好的,arduino也不斷地發送數據,這是從來沒有讀過的程序,這可能是一個問題?難道是緩衝區已滿並且WriteFile正在等待空間寫入嗎?,因爲知道我不寫入串行,它似乎工作得很好...

回答

0

WriteFile()將停止當發送緩衝區滿容量時。它只會在您正確設置握手的情況下清空。要麼電氣連接DSR和CTS信號,這往往會在Arduino上跳過。或者通過禁用握手,SetCommState()函數。使用SetCommTimeouts()設置超時是另一個體面的策略,可以添加一些最小的錯誤恢復。

不讀取Arduino發送的數據也沒有得到很多分數。當然,最好是逐步實現這一點,以便您可以一次專注於解決一個問題。但它通常不會阻止PC傳輸數據,模仿握手線路錯誤。

+0

感謝您的回答。我會嘗試其中的一些看看它是如何工作的。 – MyUserIsThis