请大神支招 为何GetCommState失败?
想实现两台计算机的串口通信,一台笔记本,一台台式机,和一根USB转串口。编译运行之后显示Createfile成功,接着GetCommState失败,虽然最后把发送的数据打印出来了,但此处出现的串口设置失败的问题还是让我不解。
参考了一个相关问题的解答,“除非你的USB设备被驱动映射为串口,不然这一系列函数都会失败”,我的设备管理器显示如图,所以应该不是转换的问题?
[attach]83954[/attach]
COM口的设置也与代码中串口的设置保持了一致,但是仍然提示GetCommState失败。
[attach]83955[/attach]
刚才不小心把帖子发错板块了 想请各位大神支支招,谢谢!
用到的部分代码如下
程序代码:
/* 串口初始化程序 cominit.c */ #include <windows.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #define BAUD_RATE 9600 #define pr printf #define EVENPARITY 2 void serialinit(HANDLE* hcom) { COMMTIMEOUTS timeouts; //超时函数设置 COMMCONFIG dcb; //dcb的参数配置 /* 把串口作为文件打开 */ *hcom=CreateFile("COM7", //打开串口1,hcom为串口句柄 GENERIC_READ|GENERIC_WRITE, //允许读写 0, //通讯设备必须以独占方式打开 NULL, //安全属性 OPEN_EXISTING, //通讯设备已存在 0, //异步I/O /*FILE_FLAG_OVERLAPPED*/ NULL); if(*hcom==(HANDLE)-1) //打开串口失败返回 { if(GetLastError()==ERROR_FILE_NOT_FOUND) { pr("serial port does exist.\n"); } pr("some other error occured, Inform user.\n"); } else pr("port open successed!\n"); /* 串口超时结构体设置 */ GetCommTimeouts(*hcom,&timeouts); //COMMTIMEOUTS timeouts={0}; timeouts.ReadIntervalTimeout=MAXWORD; //接收时两字符之间的最大时延 timeouts.ReadTotalTimeoutMultiplier=0; //指定以毫秒为单位的累积值,用于计算读操作时的超时总数 timeouts.ReadTotalTimeoutConstant=0; //指定以毫秒为单位的常数,用于计算读操作时的超时总数 timeouts.WriteTotalTimeoutMultiplier=0; //计算写操作时的超时总数 timeouts.WriteTotalTimeoutConstant=20; //计算写操作时的超时总数 if(!SetCommTimeouts(*hcom,&timeouts)) //与串口绑定失败返回 { pr("error setting port state.\n"); } /* 设置串口各项参数 */ if(!GetCommState(*hcom,&dcb.dcb)) { pr("error setting serial port state.\n"); //串口绑定失败 } dcb.dcb.BaudRate=BAUD_RATE; //波特率为9600 dcb.dcb.ByteSize=8; //设置数据位 dcb.dcb.Parity=EVENPARITY; //偶校验 校验方式,值0~4分别对应无校验、奇校验、偶校验、校验置位、校验清零 dcb.dcb.StopBits=1; //一个停止位 dcb.dcb.fBinary=TRUE; dcb.dcb.fParity=TRUE; if(!SetCommState(*hcom,&dcb.dcb)) //DCB绑定失败返回 { pr("串口设置出错!\n"); } } /*=======================================*/ /* depthrecv.c */ /* 数据接收程序,调用串口初始化程序 */ /* hcom6对应串口描述符 */ /*=======================================*/ #include <string.h> #include <windows.h> #include <stdlib.h> #include <stdio.h> #include "cominit.c" /*Andrew modified 1*/ #define size6 30 #define pr printf char com[7]; //串口接收的数据帧 //char depth_str1={"00000000"}; //截取后的数据帧,初始值为零 //float depth1; //浮点型深度数据 extern void serialinit(HANDLE* hcom); /*Andrew modified 2*/ void main() { HANDLE hcom6; /*Andrew modified 3*/ int nwrite; int inum=0,temp=0; int depthstate=1; char *readbuff6; //数据接收缓冲区 char *writebuff6; //数据写入缓冲区 int pos=0; DWORD dwBytesWritten,dwBytesRead; serialinit(&hcom6); /*Andrew modified 4*/ /* 设置串口输入输出缓冲区 */ if(!SetupComm(hcom6,1024,1024)) { pr("设置串口读写缓冲区失败!\n"); } PurgeComm(hcom6,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); /* 将数据写入缓冲区操作 */ writebuff6=(char *)malloc(size6); pr("please input your data:"); scanf("%s",writebuff6); nwrite=0; for(temp = 0;writebuff6[temp]!='\0';temp++) { nwrite++; } if(!WriteFile(hcom6,writebuff6,nwrite,&dwBytesWritten,NULL)) { pr("error writting to output buffer.\n");} else pr("written data:%s\n",writebuff6); system("pause"); /* 从输出缓冲区读数据 */ readbuff6=(char *)malloc(size6); memset(readbuff6,0,size6); //将缓冲区的前size6个字节用0代替,相当于初始化 if(!ReadFile(hcom6,readbuff6,size6,&dwBytesRead,NULL)) { pr("error reading from input buffer\n"); } else pr("Data read from buffer is:%s\n",readbuff6); /* 关闭串口 */ CloseHandle(hcom6); //关闭设备句柄 free(readbuff6); free(writebuff6); }
[此贴子已经被作者于2016-3-31 11:11编辑过]