Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;:如果串行端口没有新数据,如何忽略ReadFile()? 我正在做一个C++程序,它可以从串口读取并写入串口。我在读取数据方面有问题。如果没有新数据,ReadFile()正在等待,直到收到新数据_C++_Winapi_Serial Port_Readfile - Fatal编程技术网

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
...