仅当从另一端发送数据时从串行端口读取(c ++)

时间:2013-12-06 08:27:08

标签: c++ winapi serial-port char

我在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是否具有某种价值。或者是否有其他选项可以检查是否已发生读取事件。

2 个答案:

答案 0 :(得分:1)

你可以轮询缓冲区。

DWORD nBytesRead = serialObj.ReadTest(inBuffer, sizeof(inBuffer));
if (nBytesRead == 0)
{
   //no data
}
else
{
   //do something
}

我想您需要在while循环中执行此操作,因为您永远不知道何时获得新数据。

答案 1 :(得分:0)

首先,您必须确保将串行端口作为重叠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

您可能对this page感兴趣。