CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  专题开发/技术/项目 >  网络通信

为什么打不开串口-->解决我给200分()

楼主xuweiqun(打雷啦)2004-04-01 14:56:04 在 专题开发/技术/项目 / 网络通信 提问

unsigned   long   n   =   0;  
  BOOL   l_bWaitingOnRead   =   FALSE;  
  OVERLAPPED   l_osReader   =   {0};  
  BOOL   l_bReturn   =   FALSE;  
   
  l_osReader.hEvent   =   CreateEvent(NULL,   TRUE,   FALSE,   NULL);  
  if(l_osReader.hEvent   ==   NULL)  
  {  
  return   FAIL;  
  }  
   
  if(!ReadFile(this->m_hComm,   p_abRespArr,   256,   &n,   &l_osReader))    
  {  
  if(GetLastError()   !=   ERROR_IO_PENDING)  
  {  
  l_bReturn   =   FAIL;  
  AfxMessageBox("读失败2,ReadFile");     //测试  
   
  }  
  else  
  {  
  l_bWaitingOnRead   =   TRUE;  
  }  
  }  
  else    
  {        
  p_iToRead   =   n;  
  l_bReturn   =   SUCCESS;  
  } 问题点数:100、回复次数:8Top

1 楼xuweiqun(打雷啦)回复于 2004-04-01 15:01:19 得分 0

上面是ReadFile   失败,这个是WriteFile失败  
   
   
  OVERLAPPED   l_osWrite   =   {0};  
  DWORD   l_dwWritten;    
  DWORD   l_dwRes;    
  BOOL   l_bReturn;  
         
  l_osWrite.hEvent   =   CreateEvent(NULL,   TRUE,   FALSE,   NULL);  
  if(l_osWrite.hEvent   ==   NULL)  
  {  
    return   FAIL;  
       
   
  }  
   
  if(!WriteFile(m_hComm,   p_abCmdArr,   p_iToWrite,   &l_dwWritten,   &l_osWrite))    
  {  
      if(GetLastError()   !=   ERROR_IO_PENDING)    
      {    
  l_bReturn   =   FAIL;  
  AfxMessageBox("写失败2,WriteFile");     //测试  
      }  
      else  
      {            
  l_dwRes   =   WaitForSingleObject(l_osWrite.hEvent,   INFINITE);  
  switch(l_dwRes)  
  {  
  case   WAIT_OBJECT_0: //   OVERLAPPED   structure's   event   has   been   signaled.    
  if   (!GetOverlappedResult(m_hComm,   &l_osWrite,   &l_dwWritten,   FALSE))  
  {  
  l_bReturn   =   FAIL;                                    
  }  
  else  
  {  
                                  //   Write   operation   completed   successfully.  
  l_bReturn   =   SUCCESS;  
  }  
  break;                          
  default:  
                                                                                            l_bReturn   =   FAIL;  
  break;      
  }  
  }    
  }  
  else             //   WriteFile   completed   immediately.              
  {  
  l_bReturn   =   SUCCESS;  
    AfxMessageBox("传送成功");       //     测试  
  }  
   
  CloseHandle(l_osWrite.hEvent);        
  return   l_bReturn;Top

2 楼hedy02(爬上岸的鱼)回复于 2004-04-02 17:50:34 得分 50

把错误提示写出来,好分析。。。  
  是不是每次都到“//测试”这个地方?  
  打开的时候CreateFile()是否用了OVERLAPPED   ?  
   
  我看你write的那块没什么错啊,我都测试过了,就不知道你之前的设置那些是什么就是了  
  我的open()  
  {  
  DWORD   dwFlags   =   bOverlap   ?   FILE_FLAG_OVERLAPPED   :   0;  
  CString   strCom;  
  strCom.Format("COM%d",m_nCom   +   1);  
   
  //   打开指定的串口  
  HANDLE   hCom   =   ::CreateFile(strCom,GENERIC_READ   |   GENERIC_WRITE,0,NULL,  
  OPEN_EXISTING,dwFlags,NULL);  
   
  //   获得串口的配置信息  
  COMMCONFIG   ComCfg;  
  DWORD   dwSize   =   sizeof(ComCfg);  
  if   (!::GetCommConfig(hCom,&ComCfg,&dwSize))  
  {  
  AfxMessageBox(_T("读取串口配置失败!"));  
  ::CloseHandle(hCom);  
  return   NULL;  
  }  
   
  //   获得当前的串口配置状态  
  DCB   dcb;  
  if   (!GetCommState(hCom,&dcb))  
  {  
  AfxMessageBox(_T("读取串口状态失败!"));  
  ::CloseHandle(hCom);  
  return   NULL;  
  }  
   
  //   设置奇偶校验方式  
  switch   (m_nParity)  
  {  
  case   0:  
  //   不校验  
  dcb.Parity   =   NOPARITY;          
  break;  
  case   1:  
  //   奇校验  
  dcb.Parity   =   ODDPARITY;        
  break;  
  case   2:  
  //   偶校验  
  dcb.Parity   =   EVENPARITY;      
  break;  
  case   3:  
  //   MARK方式  
  dcb.Parity   =   MARKPARITY;      
  break;  
  case   4:  
  //   SPACE方式  
  dcb.Parity   =   SPACEPARITY;    
  break;  
  }  
   
  //   设置数据位格式  
  dcb.ByteSize   =   m_nData;  
   
  //   设置波特率  
  dcb.BaudRate   =   m_dwBaud;  
   
  //   设置停止位方式  
  switch   (m_nStop)  
  {  
  case   0:  
  //   停止位为1位  
  dcb.StopBits   =   ONESTOPBIT;  
  break;  
  case   1:  
  //   停止位为1.5位  
  dcb.StopBits   =   ONE5STOPBITS;    
  break;  
  case   2:  
  //   停止位为2位  
  dcb.StopBits   =   TWOSTOPBITS;      
  break;  
  }  
   
  //   设置灵敏度  
  dcb.fDsrSensitivity   =   FALSE;  
   
  //   设置流控制方式  
  switch   (m_nShake)  
  {  
          case   0:  
  //   无流量控制  
  dcb.fOutxCtsFlow   =   FALSE;  
  dcb.fOutxDsrFlow   =   FALSE;  
  dcb.fOutX   =   FALSE;  
  dcb.fInX   =   FALSE;  
  break;  
  case   1:  
  //   RTS控制,监视CTS信号  
  dcb.fOutxCtsFlow   =   TRUE;  
  dcb.fOutxDsrFlow   =   FALSE;  
  dcb.fRtsControl   =   RTS_CONTROL_HANDSHAKE;  
  dcb.fOutX   =   FALSE;  
  dcb.fInX   =   FALSE;  
  break;  
          case   2:  
  //   DTR控制,监视CTS信号  
  dcb.fOutxCtsFlow   =   TRUE;  
  dcb.fOutxDsrFlow   =   FALSE;  
  dcb.fDtrControl   =   DTR_CONTROL_HANDSHAKE;  
  dcb.fOutX   =   FALSE;  
  dcb.fInX   =   FALSE;  
  break;  
  case   3:  
  //   RTS控制,监视DSR信号  
  dcb.fOutxCtsFlow   =   FALSE;  
  dcb.fOutxDsrFlow   =   TRUE;  
  dcb.fRtsControl   =   RTS_CONTROL_HANDSHAKE;  
  dcb.fOutX   =   FALSE;  
  dcb.fInX   =   FALSE;  
  break;  
          case   4:  
  //   DTR控制,监视DSR信号  
  dcb.fOutxCtsFlow   =   FALSE;  
  dcb.fOutxDsrFlow   =   TRUE;  
  dcb.fDtrControl   =   DTR_CONTROL_HANDSHAKE;  
  dcb.fOutX   =   FALSE;  
  dcb.fInX   =   FALSE;  
  break;  
          case   5:  
  //   XON/XOFF控制方式  
  dcb.fOutxCtsFlow   =   FALSE;  
  dcb.fOutxDsrFlow   =   FALSE;  
  dcb.fOutX   =   TRUE;  
  dcb.fInX   =   TRUE;  
  dcb.XonChar   =   0x11;  
  dcb.XoffChar   =   0x13;  
  dcb.XoffLim   =   100;  
  dcb.XonLim   =   100;  
  break;  
  }  
   
  //   将设定的参数值用于该串口  
  if   (!SetCommState(hCom,   &dcb))  
  {  
  AfxMessageBox(_T("设置COM端口状态失败!"));  
  ::CloseHandle(hCom);  
  return   NULL;  
  }  
   
  return   hCom;  
  }  
  Top

3 楼hell190109()回复于 2004-04-02 18:36:03 得分 10

关注Top

4 楼gunmanpan(mu)回复于 2004-04-03 15:52:00 得分 10

关注INGTop

5 楼wlpwind(robin)回复于 2004-04-03 18:34:12 得分 10

不知道你参数设置正确了没有。Top

6 楼xuweiqun(打雷啦)回复于 2004-04-05 21:15:03 得分 0

不好意思,我的问题已经解决了,  
  过了3天。  
  我竟然忘了这里错在哪里,好象是其他一个地方错了,然后就涉及到这里。  
  非常感谢!!!Top

7 楼hedy02(爬上岸的鱼)回复于 2004-04-09 10:59:49 得分 10

给分啊,呵呵Top

8 楼awjx(啦啦啦)回复于 2004-04-09 15:06:31 得分 10

咦!解决啦!Top

相关问题

  • 模拟串口为什么打不开?~~~~~~~~~~
  • 用evc3.0,在模拟环境中为什么打不开串口?
  • 串口打印
  • 为什么只能打开1--9串口10以上都不能打开呢?
  • 打开COM10以上的串口会出错?为什么?(附源码)
  • ComboBox打开串口
  • 为什么无法关闭串口啊??
  • 极度郁闷,超级不爽,散分!为什么我做的串口通信程序打包后不能读写串口????
  • 连接Modem的串口无法打开,为什么?用GetLastError返回错误120:即This function is not supported on this system.
  • 如何打开串口

关键词

  • 测试
  • null
  • 串口
  • breturn
  • oswrite
  • dcb
  • comcfg
  • hcom
  • osreader
  • 失败

得分解答快速导航

  • 帖主:xuweiqun
  • hedy02
  • hell190109
  • gunmanpan
  • wlpwind
  • hedy02
  • awjx

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo