| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1577 人关注过本帖
标题:请大神支招 为何GetCommState失败?
只看楼主 加入收藏
winterlulu
Rank: 1
等 级:新手上路
帖 子:14
专家分:9
注 册:2016-3-29
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:2 
请大神支招 为何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编辑过]

搜索更多相关主题的帖子: 笔记本 计算机 台式机 通信 笔记本 计算机 台式机 通信 
2016-03-30 23:58
winterlulu
Rank: 1
等 级:新手上路
帖 子:14
专家分:9
注 册:2016-3-29
收藏
得分:0 
全部代码贴在这里了
2016-03-31 11:11
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:10 
自己发了几个重复贴,却又不去看看,那不如只开一个帖子好了
2016-03-31 11:23
快速回复:请大神支招 为何GetCommState失败?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038076 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved