【发布时间】:2025-12-14 08:10:01
【问题描述】:
我目前正在尝试编写一个程序,该程序将从串行通信端口上的 Arduino HC-05 模块读取蓝牙输出。
http://cdn.makezine.com/uploads/2014/03/hc_hc-05-user-instructions-bluetooth.pdf
当我打开一个 Putty 终端并告诉它监听 COM4 时,我能够看到在 Arduino 上运行的程序正在打印的输出。
但是,当我运行以下程序以尝试以编程方式处理串行端口上的传入数据时,我得到了显示的输出。
#include <Windows.h>
#include <string>
#include <atltrace.h>
#include <iostream>
int main(int argc, char** argv[]) {
HANDLE hComm = CreateFile(
L"COM4",
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
NULL,
0
);
if (hComm == INVALID_HANDLE_VALUE) {
std::cout << "Error opening COM4" << std::endl;
return 1;
}
DWORD dwRead;
BOOL fWaitingOnRead = false;
OVERLAPPED osReader = { 0 };
char message[100];
osReader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (osReader.hEvent == NULL) {
std::cout << "Error creating overlapping event" << std::endl;
return 2;
}
while (1) {
if (!fWaitingOnRead) {
if (!ReadFile(
hComm,
&message,
sizeof(message),
&dwRead,
NULL
)) {
if (GetLastError() != ERROR_IO_PENDING) {
std::cout << "Communications error" << std::endl;
return 3;
}
}
else {
message[100] = '\0';
std::cout << message << std::endl;
}
}
}
return 0;
}
我对句柄和 ReadFile 函数调用进行了更改,以便它将在无限循环中同步进行调用。但是,Visual Studio 会弹出一条警告说程序已停止工作,然后要求调试或关闭程序。我的假设是它一定是在某处停滞或未能在堆栈中某处执行某些 WindowsAPI 函数。
任何帮助,指点,不胜感激。
【问题讨论】:
-
如果错误是 ERROR_IO_PENDING,只打印缓冲区没有任何意义。您应该只在出现 no 错误时打印它,而当您这样做时,您应该只打印
dwRead字节。如果错误不是 ERROR_IO_PENDING 你应该打印出它实际上是什么。 -
打印缓冲区在 ReadFile 失败的 else 逻辑中
-
不,不是;
else与if (GetLastError...不与if (!ReadFile...配对 -
我很愚蠢。谢谢
-
现在您已经删除了
FILE_FLAG_OVERLAPPED,您不应再将osReader传递给ReadFile。
标签: c++ windows bluetooth arduino