做串口通讯的时候,我用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值的,这没法变!那么我该怎么解决报文的读取问题呢?谢谢!

解决方案 »

  1.   

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

  2.   

    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;
    }
      

  3.   

    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 ) ; 

      

  4.   

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

  5.   

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