繁体   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