2012-10-23 44 views
0

我必須通過串行發送一個命令並根據命令接收一個答案並根據收到的消息做一些事情。我被告知我必須使用回調,因爲這是一個異步操作。c中的異步通信

我有2個線程,一個可以發送消息,另一個可以接收消息。

例子:

//Thread 1 
sendMessage("Initialize"); 

//Thread 2 
while(1) 
{ 
    checkForMessages(); 
} 

我如何編寫初始化爲特定信息,並處理收到的消息的功能。

實施例:

CommHandle(Command,MsgReceived) 
{ 
    if(command) 
    { 
    if(MsgReceived == ok) 
    ... 
    if(MsgReceived == error) 
    ... 
    } 

}

+1

任何偏好的平臺? – WhozCraig

+0

Windows,但應該是平臺無關的。 – dare2k

+0

使用本地窗口可能無法實現與平臺無關的串行通信。我假設你需要使用cygwin。 – alk

回答

1

我被告知,我必須使用回調,因爲這是一個異步操作。

不一定。 Windows中有一種叫做「異步I/O」的東西,這被認爲是一個內部的Windows術語,它與「重疊的I/O」(explanation here)是同義詞。當您使用重疊I/O時,您將在傳輸完成時收到回叫。這很好,因爲它減少了CPU負載,但是如果你的程序在等待的時候沒有什麼更好的事情,那麼它並不是真的有必要。所以這取決於你的應用程序的性質。

但無論你的應用程序的性質,你的確應該處理所有的串行通信通過線程,這樣就不會造成主界面線程以尷尬的方式凍結。

有一個rx和一個tx線程給你一個困境,雖然他們使用相同的端口句柄,他們不能自由訪問它,因爲那不會是線程安全的。解決方案是使一個超線程處理所有傳輸,或通過互斥鎖保護端口句柄。

我不確定哪種方法最好,我沒有建議。我只用了「超線」一個自己:一個明顯的好處是,我可以集中像「殺死線程」,WaitFor的說明「端口是開放的」,「端口關閉」在一個地方。但同時代碼變得相當複雜。

我該如何編寫一個爲特定消息初始化並處理收到的消息的函數。

讓你的線程(S)鏟他們接收到的數據的緩衝區。一個tx緩衝區和一個rx緩衝區。根據您的串行協議和性能,你可能需要使用雙緩衝:一個用於電流傳輸和一個包含最近接收到的數據。

然後從主,拿起從緩衝區中的數據。他們需要線程安全。一旦你已經遠遠得到了,乾脆寫一個解析器就像你使用任何形式的數據,並採取行動,從那裏

+0

謝謝。隨着超線程的建議給了我一個可能的解決方案的想法。 – dare2k