我一直在研究一些涉及 Win32 API 和串行通信的东西。我已经设法弄清楚如何打开一个 COM 端口,并对其进行写入/读取,但我想知道是否有一种方法可以查看有多少字节和/或字符可供读取。 我在想也许
GetFileSizeEx()
功能会起作用,但它看起来不像。
我不完全确定这个问题是否非常清楚(关于我在寻找什么)所以只是举一个更明显的例子,我希望找到像 Arduino 的
Serial.available()
功能
到目前为止,这是我的代码
#include <Windows.h>
#include <iostream>
#include <string>
int main() {
HANDLE hFile;
hFile = CreateFile("COM4",
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if(hFile == INVALID_HANDLE_VALUE) {
std::cout << "bad handle" << std::endl;
return 0;
}
DCB cerialParams = {0};
cerialParams.DCBlength = sizeof(cerialParams);
if(!GetCommState(hFile, &cerialParams)) {
// error, but I'm too lazy to handle it.
return 0;
}
cerialParams.BaudRate = CBR_9600;
cerialParams.ByteSize = 8;
cerialParams.StopBits = ONESTOPBIT;
cerialParams.Parity = NOPARITY;
if(!SetCommState(hFile, &cerialParams)) {
// read above
return 0;
}
COMMTIMEOUTS timeouts = {0};
timeouts.ReadIntervalTimeout = 500;
timeouts.ReadTotalTimeoutConstant = 500;
timeouts.ReadTotalTimeoutMultiplier = 10;
timeouts.WriteTotalTimeoutConstant = 500;
timeouts.WriteTotalTimeoutMultiplier = 10;
if(!SetCommTimeouts(hFile, &timeouts)) {
// do it again
return 0;
}
BOOL success = 0;
PLARGE_INTEGER fSizeStruct{0};
//I've noticed that after I try to run this function, printing to the console no longer seems to work, oh well.
success = GetFileSizeEx(hFile, fSizeStruct);
std::cout << '"' << fSizeStruct << '"' << std::endl;
std::cout << success;
CloseHandle(hFile);
return 0;
}
ClearCommError
:
检索有关通信错误的信息并报告通信设备的当前状态。
它填充的COMSTAT结构有一个
cbInQue
成员:
串行提供程序接收但尚未被
操作读取的字节数。ReadFile
相关阅读(在 Delphi 中,但在这里仍然适用):