Visual studio 2008 在Visual C+中写入串行(Com)端口+;

Visual studio 2008 在Visual C+中写入串行(Com)端口+;,visual-studio-2008,visual-c++,serial-port,Visual Studio 2008,Visual C++,Serial Port,我有一个连接在端口COM4上的设备(115200波特,8-N-1)。根据我发现的示例,我使用以下方法打开端口: Keyboard_Handle=CreateFile("\\\\.\\COM4",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL); if(GetLastError() !=0 || Keyboard_Handle == INVALID_HANDLE_VALUE)

我有一个连接在端口COM4上的设备(115200波特,8-N-1)。根据我发现的示例,我使用以下方法打开端口:

Keyboard_Handle=CreateFile("\\\\.\\COM4",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL); if(GetLastError() !=0 || Keyboard_Handle == INVALID_HANDLE_VALUE) { AfxMessageBox("Error opening connection to Keyboard"); exit(1); } char buffer[100]; strcpy(buffer,"baud=115200 parity=N data=8 stop=1"); BuildCommDCB((char*)&buffer,&dcb)) if(GetCommState(Keyboard_Handle, &dcb)) { dcb.BaudRate = CBR_115200; dcb.ByteSize = 8; dcb.Parity = 0; dcb.StopBits = 1; SetCommState(Keyboard_Handle, &dcb); } LPDWORD bytes_written; LPDWORD bytes_read; LPOVERLAPPED OVERLAP; char write_buf[10]; write_buf[0] = 's'; write_buf[1] = '\0'; if(Keyboard_Handle != NULL) { WriteFile(Keyboard_Handle, (LPCVOID)write_buf , strlen(write_buf), bytes_written, OVERLAP); } 键盘句柄=CreateFile(“\\.\\COM4”,一般写入,0,空,打开,文件标志重叠,空); 如果(GetLastError()!=0 | |键盘(U句柄==无效的(U句柄)值) { AfxMessageBox(“打开键盘连接时出错”); 出口(1); } 字符缓冲区[100]; strcpy(缓冲区,“波特=115200奇偶校验=N数据=8停止=1”); BuildCommDCB((字符*)&缓冲区和dcb)) if(GetCommState(键盘\句柄和dcb)) { dcb.BaudRate=CBR_115200; dcb.ByteSize=8; dcb.奇偶性=0; dcb.StopBits=1; SetCommState(键盘、手柄和dcb); } 稍后在代码中,我使用以下命令调用端口上的WriteFile:

Keyboard_Handle=CreateFile("\\\\.\\COM4",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL); if(GetLastError() !=0 || Keyboard_Handle == INVALID_HANDLE_VALUE) { AfxMessageBox("Error opening connection to Keyboard"); exit(1); } char buffer[100]; strcpy(buffer,"baud=115200 parity=N data=8 stop=1"); BuildCommDCB((char*)&buffer,&dcb)) if(GetCommState(Keyboard_Handle, &dcb)) { dcb.BaudRate = CBR_115200; dcb.ByteSize = 8; dcb.Parity = 0; dcb.StopBits = 1; SetCommState(Keyboard_Handle, &dcb); } LPDWORD bytes_written; LPDWORD bytes_read; LPOVERLAPPED OVERLAP; char write_buf[10]; write_buf[0] = 's'; write_buf[1] = '\0'; if(Keyboard_Handle != NULL) { WriteFile(Keyboard_Handle, (LPCVOID)write_buf , strlen(write_buf), bytes_written, OVERLAP); } 写入的LPDWORD字节; 读取LPDWORD字节; 重叠重叠; char write_buf[10]; 写入_buf[0]=“s”; 写入_buf[1]='\0'; if(键盘\句柄!=NULL){ WriteFile(键盘句柄,(LPCVOID)write\u buf,strlen(write\u buf),bytes\u write,重叠); } 每次运行代码时,JIT调试器都会抱怨出现未处理的异常(尽管WriteFile位于Try/catch块中)


我这样做有什么问题吗?

字节\你写的
需要是一个变量的地址;编译器不会编译您发布的语句

同样,“
重叠
”也没有意义

您是否检查了
CreateFile
是否成功

当你在上面调用strlen时,
write\u buf
里面有什么

尝试复制并粘贴您正在使用的实际代码

此外,您正在使用的示例似乎不是很好/信息丰富。尝试


同样,从Microsoft站点的示例程序开始,在修改之前对其进行测试(以检查它是否在您的机器上工作),然后对其进行修改。

bytes\u writed
需要是变量的地址;编译器不会编译您发布的语句

同样,“
重叠
”也没有意义

您是否检查了
CreateFile
是否成功

当你在上面调用strlen时,
write\u buf
里面有什么

尝试复制并粘贴您正在使用的实际代码

此外,您正在使用的示例似乎不是很好/信息丰富。尝试


同样从Microsoft站点的示例程序开始,在修改它之前测试它(检查它是否在您的机器上工作),然后修改它。

当您调用
SetCommState
时,返回值是0吗?它可能会出错,这可能会导致更多的问题

另外,您是否逐行检查以确保是WriteFile调用导致它崩溃


最后,您的应用程序可能挂接了一些防病毒软件或其他软件,从而导致这些问题(查找模块列表中加载的未知dll)。

当您调用
SetCommState
时,返回值是否为0?它可能会出错,这可能会导致更多的问题

另外,您是否逐行检查以确保是WriteFile调用导致它崩溃


最后,你可能会有一些防病毒软件或其他软件挂接到你的应用程序中,导致这些问题(查找模块列表中加载的未知dll)。

首先,我提到代码运行,这意味着它已编译。其次,我添加了一些代码,这些代码是从最初的帖子中删掉的。第三,谢谢你的链接。现在你已经添加了字节声明,我看到了问题:它是一个指针,在使用它之前你还没有初始化它。与重叠指针相同(在使用它之前,您也没有初始化它)。此外,打开COM端口失败意味着句柄包含无效的\u handle\u value(不是0)值。为“写入的字节数”参数使用指针是不正常的。更常见的方法是将其声明为type
DWORD
(而不是type
LPDWORD
),并使用
&
通过指针传递它,例如作为
&dwbytesWrite
:这样您就可以通过指针传递值,而不是通过值传递指针(在您的情况下,是未初始化的指针)。谢谢,正是这样的小事让我在编写代码时一直绊倒。进行您建议的更改后,我可以看到错误代码为997,我正在解决该问题。谢谢。首先,我提到代码运行,这意味着它已编译。其次,我添加了一些代码,这些代码是从最初的帖子中删掉的。第三,谢谢你的链接。现在你已经添加了字节声明,我看到了问题:它是一个指针,在使用它之前你还没有初始化它。与重叠指针相同(在使用它之前,您也没有初始化它)。此外,打开COM端口失败意味着句柄包含无效的\u handle\u value(不是0)值。为“写入的字节数”参数使用指针是不正常的。更常见的方法是将其声明为type
DWORD
(而不是type
LPDWORD
),并使用
&
通过指针传递它,例如作为
&dwbytesWrite
:这样您就可以通过指针传递值,而不是通过值传递指针(在您的情况下,是未初始化的指针)。谢谢,正是这样的小事让我在编写代码时一直绊倒。进行您建议的更改后,我可以看到错误代码为997,我正在解决该问题。谢谢。返回值是0。再看一眼,我用ReadFile调用替换了WriteFile行,它也崩溃了,但如果没有这两行代码,代码都可以正常运行