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

搜索更多相关主题的帖子: 笔记本 计算机 台式机 通信 
2016-03-30 23:49
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:5 
重要的放在最前面说,你为什么贴一个别人无法编译调试的代码?
增加个
int main( void )
{
    HANDLE hcom;
    serialinit( &hcom );
}
不会浪费你太多时间,却节约了每一个想回答你问题的人的时间。
当别人拷贝你代码后,发现无法编译,大多数人会放弃,不作死就不会死。

正文中说“接着GetCommState失败”,但我怀疑你想说的是SetCommState失败
“1个停止位”对应的宏是ONESTOPBIT,ONESTOPBIT的值是0,不是1。dcb.dcb.StopBits=1;这是设置成1.5个停止位
2016-03-31 10:30
winterlulu
Rank: 1
等 级:新手上路
帖 子:14
专家分:9
注 册:2016-3-29
收藏
得分:0 
回复 2楼 rjsp
谢谢批评和指正! 我已经修改了停止位处的错误

我看到网上的讲解 在这一段代码中 用的是FILE_FLAG_OVERLAPPED
程序代码:
 *hcom=CreateFile("COM2",               //打开串口1,hcom为串口句柄
        GENERIC_READ|GENERIC_WRITE,       //允许读写
        0,                                //通讯设备必须以独占方式打开
        NULL,                             //安全属性
        OPEN_EXISTING,                    //创建方式,通讯设备已存在
        FILE_FLAG_OVERLAPPED,             //异步I/O  /*FILE_FLAG_OVERLAPPED*/                
        NULL);

但是输出结果会是这样 显示无法将数据写入缓冲区 再按按键就自动退出了
图片附件: 游客没有浏览图片的权限,请 登录注册


 如果将FILE_FLAG_OVERLAPPED置为0,输出结果是这样,可以将数据写入缓冲区,但是一直不出现代码段中的Data read from buffer is:
 并且怎么按键盘也没有反应
图片附件: 游客没有浏览图片的权限,请 登录注册


求助一下这是为什么 我该怎么改?谢谢!
2016-03-31 18:36
农民工
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:109
专家分:639
注 册:2015-8-22
收藏
得分:5 
你确定这个串口有数据到达了吗?
2016-04-01 13:31
winterlulu
Rank: 1
等 级:新手上路
帖 子:14
专家分:9
注 册:2016-3-29
收藏
得分:0 
回复 4楼 农民工
串口貌似没收到数据...不知道是哪里的问题。用串口助手发送接收没问题,但是运行程序就没有。
2016-04-02 11:59
农民工
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:109
专家分:639
注 册:2015-8-22
收藏
得分:0 
既然没有数据到达,怎么可能有数据返回呢?
2016-04-07 17:33
winterlulu
Rank: 1
等 级:新手上路
帖 子:14
专家分:9
注 册:2016-3-29
收藏
得分:0 
回复 6楼 农民工
我找到错误了,是我接收端的串口助手没有打开...所以导致没收到数据

然后又出现了新的问题。。发送端的程序显示数据写入,可以在串口助手上收到数据,但是发送端这边不能读出buffer写入的数据,也就是没有数据返回。。不知道原因是啥
2016-04-10 17:04
快速回复:请大神支招 为何GetCommState失败?
数据加载中...
 
   



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

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