使用win32 API写入串行端口-端口赢得';除非我在别的地方打开它,否则我是不会打开的 我尝试用Win32 API编写C++中的串口,写文件不返回错误,但没有发生任何事情,但是在我用另一个程序(C语言)写端口之后,C++程序工作,直到我重新启动Windows 7,这里是写代码:< /P> 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; }

使用win32 API写入串行端口-端口赢得';除非我在别的地方打开它,否则我是不会打开的 我尝试用Win32 API编写C++中的串口,写文件不返回错误,但没有发生任何事情,但是在我用另一个程序(C语言)写端口之后,C++程序工作,直到我重新启动Windows 7,这里是写代码:< /P> 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; },c++,winapi,serial-port,C++,Winapi,Serial Port,有人能看到我的bug吗?有时从干净的DCB开始比使用GetCommState要好。例如,您没有关闭流控制,因此行为取决于上一个程序如何离开它 您肯定需要正确设置流量控制字段: fOutxCtsFlow fOutxDsrFlow fDtrControl fDsrSensitivity fOutX fInX fRtsControl 通常,如果您不希望程序依赖于先前的设置,我建议不要使用GetCommState。相反,从零开始: DCB dcb = { sizeof dcb }; dcb.fBina

有人能看到我的bug吗?

有时从干净的DCB开始比使用
GetCommState
要好。例如,您没有关闭流控制,因此行为取决于上一个程序如何离开它

您肯定需要正确设置流量控制字段:

fOutxCtsFlow
fOutxDsrFlow
fDtrControl
fDsrSensitivity
fOutX
fInX
fRtsControl
通常,如果您不希望程序依赖于先前的设置,我建议不要使用
GetCommState
。相反,从零开始:

DCB dcb = { sizeof dcb };
dcb.fBinary = TRUE;
dcb.BaudRate = 19200; //19200 Baud
dcb.ByteSize = 8; //8 data bits
dcb.Parity = NOPARITY; //no parity
dcb.StopBits = ONESTOPBIT; //1 stop

除了依赖以前的设置之外,
GetCommState
也失败了,因为您没有设置
DCBlength
(文档中明确说明这必须由调用者自己设置。
GetCommState
如果不先检查您提供的大小,就无法填充缓冲区。)。例如,您没有关闭流控制,因此行为取决于上一个程序如何离开它

您肯定需要正确设置流量控制字段:

fOutxCtsFlow
fOutxDsrFlow
fDtrControl
fDsrSensitivity
fOutX
fInX
fRtsControl
通常,如果您不希望程序依赖于先前的设置,我建议不要使用
GetCommState
。相反,从零开始:

DCB dcb = { sizeof dcb };
dcb.fBinary = TRUE;
dcb.BaudRate = 19200; //19200 Baud
dcb.ByteSize = 8; //8 data bits
dcb.Parity = NOPARITY; //no parity
dcb.StopBits = ONESTOPBIT; //1 stop

除了依赖于以前的设置之外,
GetCommState
也失败了,因为您没有设置
DCBlength
(文档中明确说明这必须由调用方自己设置。
GetCommState
在没有先检查您提供的大小之前无法填充缓冲区。)。

这是一个意外。您忘记在CreateFile调用中指定FILE_FLAG_OVERLAPPED,因此永远无法获得重叠的I/O。您可能不知道这一点,因为您的错误处理已中断,您不知道GetLastError未返回error_IO_PENDING时的错误代码是什么样子。当WriteFile不需要阻塞时,它会意外地工作,因为数据适合驱动程序的传输缓冲区。按照Ben的解释对握手设置进行模块化


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

这是偶然的。您忘记在CreateFile调用中指定FILE_FLAG_OVERLAPPED,因此永远无法获得重叠的I/O。您可能不知道这一点,因为您的错误处理已中断,您不知道GetLastError未返回error_IO_PENDING时的错误代码是什么样子。当WriteFile不需要阻塞时,它会意外地工作,因为数据适合驱动程序的传输缓冲区。按照Ben的解释对握手设置进行模块化


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

我试图从msdn中找到一个例子:在那里,他们像这样重置DCB:DCB DCB={0}@user1120007:我已经报告了文档错误。调用
GetCommState
之前,需要设置
DCBlength
成员。这对于接受结构的Win32 API非常常见,因为结构大小可以在Windows版本之间更改,所以需要告诉Windows程序使用的结构的大小(版本)。(否则就根本没有理由在结构中包含大小)我试图忽略的示例来自msdn:在那里,他们像这样重置DCB:DCB DCB={0}@user1120007:我已经报告了文档错误。调用
GetCommState
之前,需要设置
DCBlength
成员。这对于接受结构的Win32 API非常常见,因为结构大小可以在Windows版本之间更改,所以需要告诉Windows程序使用的结构的大小(版本)。(否则根本没有理由在结构中使用该尺寸)然后不要。传递NULL而不是&osWrite。然后不传递。传递NULL而不是&osWrite。