我添加了一个串口写入我的代码,现在它冻结后,几十个迭代。几分钟,它的工作只是它应该。如果我删除串口相关的行,它将永远顺利运行。我使用VisualStudio。有人能发现这个问题吗?
int main() {
HANDLE hSerial;
DCB dcbSerialParams = { 0 };
// Open the serial port
hSerial = CreateFile(L"COM1", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hSerial == INVALID_HANDLE_VALUE) {
std::cout << "Error opening serial port" << std::endl;
return 1;
}
// Set the serial port parameters
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
if (GetCommState(hSerial, &dcbSerialParams) == 0) {
std::cout << "Error getting serial port state" << std::endl;
CloseHandle(hSerial);
return 1;
}
dcbSerialParams.BaudRate = CBR_9600;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity = NOPARITY;
if (SetCommState(hSerial, &dcbSerialParams) == 0) {
std::cout << "Error setting serial port state" << std::endl;
CloseHandle(hSerial);
return 1;
}
// Send the serial message
DWORD dwBytesWritten;
char message[] = "c";
WriteFile(hSerial, message, sizeof(message) - 1, &dwBytesWritten, NULL);
while (stop == 0) {
WriteFile(hSerial, "x", sizeof(message) - 1, &dwBytesWritten, NULL);
int i = 0;
while (i < 7) {
i++;
//some code that works fine without serial port writings
}
WriteFile(hSerial, "y", sizeof(message) - 1, &dwBytesWritten, NULL);
i = 0;
while (i < 7) {
i++;
//some code that works fine without serial port writings
}
}
}
return 0;
}
我已经尽我所能把代码做得尽可能简单了。但是它仍然有一些严重的问题。
2条答案
按热度按时间kyvafyod1#
也许你会尝试在第一次调用还没有完成之前写;缓冲区可能已满,请检查PurgeComm函数。同时尝试执行事件序列。(WaitCommEvent)
cygmwpex2#
您是否正在阅读串行另一端的值?我知道,例如在Arduino类中常见的许多廉价仿制FTDI USB串行芯片上,它们有一个小(4kB)缓冲区,如果缓冲区已满,将简单地阻止调用。
如果阻塞本身是你最大的问题,另一件要考虑的事情可能是检查CreateFile中的
FILE_FLAG_OVERLAPPED
标志,它不会解决通信中断的问题,但是如果你最关心的只是在通信准备好之前不要阻塞程序的其他部分,这可能是一个选择。