簡體   English   中英

僅當從另一側發送數據時才從串行端口讀取(C ++)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM