请大神支招 为何GetCommState失败?
											想实现两台计算机的串口通信,一台笔记本,一台台式机,和一根USB转串口。编译运行之后显示Createfile成功,接着GetCommState失败,虽然最后把发送的数据打印出来了,但此处出现的串口设置失败的问题还是让我不解。
参考了一个相关问题的解答,“除非你的USB设备被驱动映射为串口,不然这一系列函数都会失败”,我的设备管理器显示如图,所以应该不是转换的问题?
COM口的设置也与代码中串口的设置保持了一致,但是仍然提示GetCommState失败。
请大神支支招!
用到的部分代码如下
 程序代码:
程序代码:  /*  串口初始化程序  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:10编辑过]



 
											





 
	    

 
	
 
											
