CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  硬件/系统

ReadFile函数是不是先足?请各位高手指点一下!焦急ing!

楼主zhongxd(小禹)2003-04-03 17:48:14 在 VC/MFC / 硬件/系统 提问

做串口通讯的时候,我用ReadFile()读取串口,代码如下  
  int   NEAR   ReadCommBlock(LPSTR   lpszBlock,int   nMaxLength)    
  {//    
            if   (!g_GPSInfo)   return   FALSE;    
              BOOL   fReadStat   ;    
              COMSTAT   ComStat   ;    
              DWORD   dwErrorFlags;    
              DWORD   dwLength;    
              DWORD   dwError;    
   
              ClearCommError(COMDEV(g_GPSInfo),&dwErrorFlags,&ComStat);    
              dwLength=min((DWORD)nMaxLength,ComStat.cbInQue);    
   
              if   (dwLength>0){      
  fReadStat=ReadFile(COMDEV   (g_GPSInfo),lpszBlock,dwLength,&dwLength,&READ_OS(g_GPSInfo));    
   
  if   (!fReadStat){      
              if   (GetLastError()==ERROR_IO_PENDING){    
  OutputDebugString("\n\rIO   Pending");    
  while(!GetOverlappedResult(COMDEV(g_GPSInfo),&READ_OS(g_GPSInfo),&dwLength,TRUE)){    
  dwError=GetLastError();    
  if(dwError   ==   ERROR_IO_INCOMPLETE)    
  continue;    
  }    
              }else{  
                        dwLength=0;    
      ClearCommError(COMDE(g_GPSInfo),&dwErrorFlags,&ComStat);    
              }    
      }    
              }    
              return     dwLength     ;    
  }    
   
  当我用它读取缓冲的时候,缓冲的第一个值为0时,转换成字符刚好是‘\0’,  
  那么返回的指针指向的值显示为空,如果读的正确的化   lpszBlock[3]  
  因该有正确的值,结果,指针后面的值都是一些随机值,这肯定就不对,是不是ReadFile函数内部用了一些字符串操作的函数比如strcpy而造成这样的错误呢?大伙帮我看一下,给点意见,我弄得报文里面是一定有0值的,这没法变!那么我该怎么解决报文的读取问题呢?谢谢! 问题点数:100、回复次数:8Top

1 楼3jaja(缘来如此)回复于 2003-04-03 18:30:30 得分 0

1.你接收的数据本来就是0;  
  2.收到数据错误。  
  3.memset(lpszBlock)Top

2 楼searchcat(断尾猫)回复于 2003-04-03 18:39:30 得分 100

把串口初始化的部分帖出来Top

3 楼zhongxd(小禹)回复于 2003-04-03 19:16:54 得分 0

BOOL   CComm::Create(CWnd   *wndPrev,int   nCom,   int   nBPS)  
  {  
  m_nPort=nCom; m_nBPS=nBPS;  
  RECT   rect={0,0,10,10};  
  Create(NULL,"XHComm",WS_OVERLAPPED,   rect,   wndPrev,1000,   NULL)   ;  
  return   TRUE;  
  }  
  BOOL   CComm::Create(LPCTSTR   lpszClassName,   LPCTSTR   lpszWindowName,   DWORD   dwStyle,   const   RECT&   rect,   CWnd*   pParentWnd,   UINT   nID,   CCreateContext*   pContext)    
  {  
          BOOL   ret=CWnd::Create(lpszClassName,   lpszWindowName,   dwStyle,   rect,   pParentWnd,   nID,   pContext);  
        for(int   i=1;i<=2;i++){  
  DestroyGPSInfo();  
  m_nPort=i;  
  if(!CreateGPSInfo(m_hWnd,m_nPort,m_nBPS)){           MessageBox("COM   init   fail!","Error");  
  return   FALSE;  
  }    
  if(OpenConnection()){                   return   true;  
  }    
            }  
            return   ret;  
  }Top

4 楼zhongxd(小禹)回复于 2003-04-03 19:20:21 得分 0

LRESULT   NEAR   CreateGPSInfo(HWND   hWnd,BYTE   nPort,int   bps)    
  {    
  if   (NULL==(g_GPSInfo=(PGPSINFO)LocalAlloc(LPTR,sizeof(GPSINFO))))    
  return   ((LRESULT)-1)   ;    
   
  g_hGPSWnd=hWnd;    
   
  COMDEV(g_GPSInfo)=0;      
  CONNECTED(g_GPSInfo)=FALSE;      
  PORT(g_GPSInfo)=nPort;    
  BAUDRATE(g_GPSInfo)=bps;    
  BYTESIZE(g_GPSInfo)=8;    
  PARITY(g_GPSInfo)=NOPARITY;    
  STOPBITS(g_GPSInfo)=ONESTOPBIT;      
   
  WRITE_OS(g_GPSInfo).Offset=0;    
  WRITE_OS(g_GPSInfo).OffsetHigh=0;    
  READ_OS(g_GPSInfo).Offset=0;    
  READ_OS(g_GPSInfo).OffsetHigh=0;    
   
  //   create   I/O   event   used   for   overlapped   reads   /   writes    
   
  READ_OS(g_GPSInfo).hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);    
  if   (READ_OS(g_GPSInfo).hEvent==NULL)    
  {    
  LocalFree(   g_GPSInfo   )   ;    
  return   (   -1   )   ;    
  }    
  WRITE_OS(g_GPSInfo).hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);    
  if   (NULL==WRITE_OS(g_GPSInfo).hEvent)    
  {    
  CloseHandle(READ_OS(g_GPSInfo).hEvent);    
  LocalFree(g_GPSInfo)   ;    
  return   (-1)   ;    
  }    
   
   
  return   (   (LRESULT)   TRUE   )   ;    
  }    
  Top

5 楼searchcat(断尾猫)回复于 2003-04-03 21:19:35 得分 0

我给你查了一下,你的程序部分是抄《Window   95串口通讯函数集合(只适用于32位)》一文的,文章中的OpenConnection()创建了一个叫CommWatchProc的线程,然后这个监视COM口的进程会把收到的字符串用消息形式发送给指定的窗口。  
   
  调用ReadCommBlock的时机是通讯口事件发生的时候,你的写法可能不对。  
   
  如果照原来的机制,你不必去直接调用ReadCommBlock过程,而简单地在相应的窗口中处理消息就行了。Top

6 楼searchcat(断尾猫)回复于 2003-04-03 21:25:23 得分 0

当然你也可以自己调用ReadCommBlock,但应该先  
  WaitCommEvent(COMDEV(npGPSInfo),&dwEvtMask,NULL);  
  等待事件发生,然后  
  if   ((dwEvtMask&EV_RXCHAR)==EV_RXCHAR)  
  判断是否是字符到达事件  
  然后再调用ReadCommBlock  
  但如果在主线程里这么做就会挂起,所以还是用原来的机制吧,写一个处理自定义消息的小过程就应该可以了。Top

7 楼zhongxd(小禹)回复于 2003-04-04 15:45:59 得分 0

我的程序里面希望实现查询的方式!一问一答,确保安全,用原来的机制好像不好解决吧,你有什么什么好的建议么?  
  Top

8 楼zhongxd(小禹)回复于 2003-04-08 21:10:34 得分 0

问题已经解决,谢谢大家,给分了!Top

相关问题

  • 串口用ReadFile()函数问题,急救
  • 请教api函数ReadFile的用法
  • readfile API函数 以及一个VBA的问题
  • 读串口时,如果超时,ReadFile函数返回什么值?
  • 可不可以使用二维数组在 ReadFile 函数里?
  • C 库函数fread,fwrite 比Win32 API ReadFile,WriteFile 快多少?
  • API函数ReadFile怎么得到读得的内容?
  • API函数ReadFile怎么得到读得的内容?
  • callbyname函数的用法(等待救命ing)
  • 函数

关键词

  • gpsinfo
  • dwlength
  • comstat
  • comdev
  • lpszblock
  • nbps
  • readfile
  • freadstat
  • dwerrorflags
  • dwerror

得分解答快速导航

  • 帖主:zhongxd
  • searchcat

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

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