C++;:如果串行端口没有新数据,如何忽略ReadFile()? 我正在做一个C++程序,它可以从串口读取并写入串口。我在读取数据方面有问题。如果没有新数据,ReadFile()正在等待,直到收到新数据
读取数据的我的代码:C++;:如果串行端口没有新数据,如何忽略ReadFile()? 我正在做一个C++程序,它可以从串口读取并写入串口。我在读取数据方面有问题。如果没有新数据,ReadFile()正在等待,直到收到新数据,c++,winapi,serial-port,readfile,C++,Winapi,Serial Port,Readfile,读取数据的我的代码: while (!_kbhit()) { if (!_kbhit()) { if (ReadFile(hSerial, &c, 1, &dwBytesRead, NULL)) { cout << c; } } } 我添加了这样的超时: serialHandle = CreateFi
while (!_kbhit())
{
if (!_kbhit())
{
if (ReadFile(hSerial, &c, 1, &dwBytesRead, NULL))
{
cout << c;
}
}
}
我添加了这样的超时:
serialHandle = CreateFile(LcomPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
COMMTIMEOUTS timeouts;
timeouts.ReadIntervalTimeout = 1;
timeouts.ReadTotalTimeoutMultiplier = 1;
timeouts.ReadTotalTimeoutConstant = 1;
timeouts.WriteTotalTimeoutMultiplier = 1;
timeouts.WriteTotalTimeoutConstant = 1;
SetCommTimeouts(serialHandle, &timeouts);
// Call function to Read
...
尝试而不是
它是异步函数
如果没有新数据,ReadFile()
正在等待,直到收到新数据
您可以使用配置读取超时,以便在超时间隔内没有数据到达时退出
ReadFile() 使用PeekNamedPipe()您需要以异步模式打开文件(使用file\u FLAG\u OVERLAPPED
FLAG)@RbMm我使用serialHandle=CreateFile打开文件(LcomPort,GENERIC\u READ,GENERIC\u WRITE,0,0,open\u EXISTING,file\u ATTRIBUTE\u NORMAL,0)。我应该在哪里添加文件\u标志\u重叠?@User987123-CreateFile(LcomPort,GENERIC\u READ | GENERIC\u WRITE,0,0,OPEN\u EXISTING,FILE\u标志\u重叠,0)
@RbMm使用此解决方案,我可以轻松停止从端口读取数据,但当有新数据时,它根本不会显示出来。这是一种异步功能
-仅当使用文件标志\u创建的文件句柄重叠时
。但是在这种情况下,ReadFile
也会异步运行。只需将ReadFile
替换为ReadFileEx
。只有在我打开我添加的文件后计划使用apc CompletionRoutine时,使用此函数才有意义:COMMTIMEOUTS timeouts;timeouts.ReadIntervalTimeout=1;timeouts.readTotalTimeout乘数=1;timeouts.ReadTotalTimeoutConstant=1;timeouts.WriteTotalTimeout乘数=1;timeouts.WriteTotalTimeoutConstant=1代码>但它仍然不工作。我的ReadFile函数:do{if(ReadFile(hSerial,&c,1,&dwBytesRead,NULL)){cout Ok。我知道了。非常感谢:)
serialHandle = CreateFile(LcomPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
COMMTIMEOUTS timeouts;
timeouts.ReadIntervalTimeout = 1;
timeouts.ReadTotalTimeoutMultiplier = 1;
timeouts.ReadTotalTimeoutConstant = 1;
timeouts.WriteTotalTimeoutMultiplier = 1;
timeouts.WriteTotalTimeoutConstant = 1;
SetCommTimeouts(serialHandle, &timeouts);
// Call function to Read
...