gpt4 book ai didi

c++ - 在 Windows 中使用 VMIN 和 VTIME

转载 作者:太空宇宙 更新时间:2023-11-04 13:18:25 26 4
gpt4 key购买 nike

我正在改编我为跨平台兼容性而编写的一个简单的 Linux 串行库。大多数事情都会保留下来(尽管 Microsoft 坚持要重命名所有内容),但有一些我没能找到的功能。

我当前的问题是 VMIN 和 VTIME(在 struct termios 中)的使用。在 Linux 上,我使用它们强制读取一定数量的字符而阻塞,但如果未收到它们则会超时并出现错误。但是,Windows 建议 BuildCommDCB使用函数而不是直接为其 DCB 设置参数(设备控制 block )结构。该函数不支持任何类似 VMIN 或 VTIME 的东西,而且 DCB 结构本身也好不了多少。

有没有办法在 Windows 中获得此功能而无需自己实现?如果完全可以避免的话,我宁愿不为我的库中的一个平台管理串行中断和回调。

编辑:SetCommTimeouts函数似乎模拟了 VTIME 的功能,但我仍然没有找到 VMIN 的任何内容。

最佳答案

我无法完美模拟 VMIN=0 和 VTIME=0 的情况,但我能够准确地重新创建其他所有内容。

在类的构造函数中,DCB 初始化并应用后(timeoutCOMMTIMEOUTSreadTimeoutreadMinCharsunsigned char:

//Set read timeouts
if(readTimeout > 0) {
if(readMinChars > 0) { //Intercharacter timeout
timeout.ReadIntervalTimeout = readTimeout * 100; //Deciseconds to milliseconds
} else { //Total timeout
timeout.ReadTotalTimeoutConstant = readTimeout * 100; //Deciseconds to milliseconds
}
} else {
if(readMinChars > 0) { //Counted read
//Handled by length parameter of serialRead(); timeouts remain 0 (unused)
} else { //"Nonblocking" read
timeout.ReadTotalTimeoutConstant = 1; //Wait as little as possible for a blocking read (1 millisecond)
}
}
if(!SetCommTimeouts(handle, &timeout)) {
printf("Error setting serial port timeout: %lu\n", GetLastError());
throw std::runtime_error("serial initialization failed");
}

完整的系列类在 Github 上可用,作为更大项目的一部分:serial.h serial.cpp

关于c++ - 在 Windows 中使用 VMIN 和 VTIME,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36293622/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com