[英]Read from serial port only when data is send from other side (c++)
我正在用win32進行串行通訊。 我使用了單獨的線程來讀寫。 這是因為我必須連續發送數據,直到應用程序運行為止,而又不影響程序的其他部分,而且我必須不斷地從串行端口讀取數據。
主要功能(WINAPI WinMain)具有
_beginthread(serialFunctionSend,0,(void*)12); // start new thread for send (write)
_beginthread(SerialFunctionReceive,0,(void*)10);//start new thread for receive(read)
發送功能不斷發送數據。 我的問題是在接收功能。 它可以接收數據。 但是我在徘徊如何檢查是否已接收到數據。 換句話說,如何檢查我們的系統是否已收到任何數據。 我僅在收到某些內容時才執行某些任務,而不是在端口未收到任何內容時執行。 因此,當程序未收到任何內容時,我必須排除條件。
我的“ SerialFunctionReceive”代碼是
void SerialFunctionReceive(void * arg)
{
char inBuffer[BUF_SIZE];
while (statusRead ==true)
{
DWORD nBytesRead = serialObj.ReadTest(inBuffer, sizeof(inBuffer));
}
}
我們可以通過在讀取的數據存儲在其中時檢查inBuffer的值來做到這一點嗎? 我們如何檢查inBuffer是否有價值。 還是有其他選項可以檢查是否發生了讀取事件。
您可以輪詢緩沖區。
DWORD nBytesRead = serialObj.ReadTest(inBuffer, sizeof(inBuffer));
if (nBytesRead == 0)
{
//no data
}
else
{
//do something
}
我猜您需要在while循環中執行此操作,因為您永遠不知道何時獲取新數據。
首先,您必須確保將串行端口作為重疊的I / O打開,以便同時發送和接收。 如果這樣做,則WaitForSingleObject()對您很有用。
OVERLAPPED ov = {0};
ov.hEvent = CreateEvent(NULL, true, false, NULL);
DWORD dwEvtMask;
WaitCommEvent(hSerialPort, &dwEvtMask, &ov);
WaitForSingleObject(ov.hEvent, INFINITE);
其中hSerialPort
是打開串行端口的CreateFile()
的返回值。 在輸入任何數據之前,該程序將在最后一行被阻止。因此,您不必一直輪詢它。
有關更多詳細信息,請參見CreateFile 。
您可能對此頁面感興趣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.