gpt4 book ai didi

c++ - 使用 win32 API 写入串行端口 - 端口不会打开,直到我在其他地方打开它

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

我尝试使用 WIN32 API 在 C++ 中写入串行端口,WriteFile 不返回 ERROR_IO_PENDING 但没有任何反应,但是在我使用另一个程序(在 C# 中)写入端口后,C++ 程序一直有效,直到我重新启动 Windows 7、这里是写代码:

static DCB dcb = {0};
static HANDLE hComm;
static int _tmain(int argc, _TCHAR* argv[])
{
hComm = CreateFile(
L"\\\\.\\COM3",
GENERIC_WRITE | GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
NULL,
NULL
);

if (hComm == INVALID_HANDLE_VALUE) // error opening port; abort
printf_s("INVALID_HANDLE_VALUE\n");

if (GetCommState(hComm, &dcb))// DCB is ready for use.
{
dcb.BaudRate = CBR_19200; //19200 Baud
dcb.ByteSize = 8; //8 data bits
dcb.Parity = NOPARITY; //no parity
dcb.StopBits = ONESTOPBIT; //1 stop
printf_s("set UP DCB\n");
}
else // Error getting current DCB settings
printf_s("ERROR getting \n"+GetLastError());

osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

WriteABuffer("!serialCMDtoSend\r",sizeof("!serialCMDtoSend\r");
}
static BOOL WriteABuffer(char * lpBuf, DWORD dwToWrite)
{
// Issue write.
if (!WriteFile(hComm, lpBuf, dwToWrite, &dwWritten, &osWrite))
{
if (GetLastError() != ERROR_IO_PENDING) { // WriteFile failed, but it isn't delayed. Report error and abort.
fRes = FALSE;
}
else {
// Write is pending.
if (!GetOverlappedResult(hComm, &osWrite, &dwWritten, TRUE))
fRes = FALSE;
else
fRes = TRUE;// Write operation completed successfully.
}
}
else
fRes = TRUE; // WriteFile completed immediately.
return fRes;
}

有人能看到我的错误吗?

最佳答案

这是偶然的。您忘记在 CreateFile 调用中指定 FILE_FLAG_OVERLAPPED,因此您永远不会得到重叠的 I/O。您可能不知道这一点,因为您的错误处理被破坏了,您不知道当 GetLastError 不返回 ERROR_IO_PENDING 时错误代码是什么样的。当 WriteFile 不必阻塞时,它会偶然工作,因为数据适合驱动程序的传输缓冲区。按照 Ben 的解释对握手设置取模。

使用重叠 I/O 并立即调用 GetOverlappedResult(TRUE) 毫无意义。您也可以使用非重叠 I/O,这样更容易上手。仅当您有其他有用的事情要做并且可以调用 WaitForMultipleObjects() 来检查写入是否完成时才使用它。在编写的情况下,这通常很难处理,编写异步代码并不容易。

关于c++ - 使用 win32 API 写入串行端口 - 端口不会打开,直到我在其他地方打开它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15989456/

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