2016-07-29 21 views
0

使用本指南/類(http://playground.arduino.cc/Interfacing/CPPWindows)我編寫了一個小型應用程序,用於將串行數據發送到Arduino。 (這將在更大的項目加入以後)C++應用程序僅在關閉時發送串行數據

int _tmain(int argc, _TCHAR* argv[]) { 

    Serial* SP = new Serial(argv[1]); 

    char outcomingData[256]; 
    int dataLength = 255; 
    int sendData; 

    while (SP->IsConnected()) { 

     strcpy_s(outcomingData, argv[2]); 
     sendData = SP->WriteData(outcomingData, dataLength); 
     printf("%s", outcomingData); 

    } 

    return 0; 
} 

的問題是,只有當我關閉應用程序或通過析構函數刪除SP的數據發送。我怎樣才能解決這個問題?是否有可以添加到課程中的解決方法或其他方法?

+0

我假設你環顧四周Arduino的網站? – 2016-07-29 21:55:07

+0

Serial * SP = new Serial(argv [1]);'或'SP-> IsConnected()'的文檔是否阻塞,直到進行握手或連接? – M4rc

+0

是的,我在論壇上搜索,但大多數帖子都是關於Linux和Arduino之間的溝通。我沒有找到任何可以幫助的東西 – Champ

回答

1

~Serial中調用CloseHandle之前,很可能您的數據正在被緩存,以致它實際上沒有寫入串行設備。您可以在您的來電CreateFile指定FILE_FLAG_WRITE_THROUGH避免這種緩存行爲,以便該文件的創建將類似於:

//Try to connect to the given port throuh CreateFile 
this->hSerial = CreateFile(portName, 
     GENERIC_READ | GENERIC_WRITE, 
     0, 
     NULL, 
     OPEN_EXISTING, 
     FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, 
     NULL); 

如果還是不行,這裏還有FILE_FLAG_NO_BUFFERING,但可能在施加限制對齊您寫入設備的數據。


如果您想保留正常的緩衝行爲,你可以添加一個Serial::Flush方法調用FlushFileBuffers強制Windows寫它已經緩存了該設備的任何數據:

void Serial::Flush() 
{ 
    FileFlushBuffers(this->hSerial); 
} 

你然後在SP->WriteData(...)之後調用SP->Flush()以確保Windows的緩衝區被刷新到設備。這將允許您進行多個小寫操作,而無需刷新每個小寫操作,這可能會提高性能。


作爲一個便箋,我會質疑你在這裏使用new。它似乎並不像它的真正需要,並SP可能只是局部構造:

Serial SP(argv[1]); 
+0

非常感謝!我嘗試了兩種解決方案,並且完美地工作!我可以問你爲什麼我不應該在那裏使用「新」嗎? – Champ

+0

使用'new'進行動態分配,並要求稍後'刪除'對象。如果你在本地構建對象,那麼當它超出範圍時它將自動被刪除。一般情況下,最好在不需要時避免使用「new」,並且在需要時使用某種智能指針,例如'std :: unique_ptr'。 –

相關問題