我通过串口接收数据(线程),  数据传输速率为38400,而且数据量大,而且非常快,运行后报错,
错误好像是地址溢出,我不知错在哪里了,请前辈们帮看看,老板快逼死人了创建串口:
  COMMTIMEOUTS CommTimeOuts;
DCB  dcb;
    m_hCom2=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL); //以异步方式打开COM2口
    if(m_hCom2==INVALID_HANDLE_VALUE)
          AfxMessageBox("打开COM1串口错误!");
    SetCommMask (m_hCom2, EV_RXCHAR ) ; //添加或修改Windows所报告的事件列表
    SetupComm (m_hCom2,1024,1024); // 初始化通讯设备参数 
    // 清除缓冲信息
    PurgeComm (m_hCom2, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR) ;
    // 对异步I/O进行设置
    CommTimeOuts.ReadIntervalTimeout = MAXDWORD ; //接收两连续字节的最大时间间隔
    CommTimeOuts.ReadTotalTimeoutMultiplier =0; //接收每字节的平均允许时间 
    CommTimeOuts.ReadTotalTimeoutConstant = 0 ; //接收时间常数
    SetCommTimeouts (m_hCom2, &CommTimeOuts) ;
   //获取并设置串口
    GetCommState ( m_hCom2, &dcb) ;
    dcb.BaudRate = 38400;
    dcb.fParity = FALSE;
    dcb.fNull = FALSE;
    dcb.StopBits = ONESTOPBIT;
    dcb.Parity = NOPARITY;
    dcb.ByteSize = 8;    SetCommState( m_hCom2, &dcb); 接收数据:
   unsigned char recvbuffer[1000];//用于接收报文的空间
    unsigned char readbuf[1000];   
   
   OVERLAPPED olRead;

    DWORD  nLength;
    DWORD dwError;
    COMSTAT ComStat;
    DWORD dwEvtMask;  
    int j=-1;
  
    memset(&ComStat,0,sizeof(COMSTAT));
   memset(&olRead,0,sizeof(OVERLAPPED));
    memset(recvbuffer,0,1000);

   olRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
   
   
while(1)//等待接受消息
{

        WaitCommEvent (m_hCom2,&dwEvtMask,NULL);
    if (dwEvtMask&EV_RXCHAR ==EV_RXCHAR )
 ClearCommError(m_hCom2,&dwError,&ComStat);
     if(ComStat.cbInQue>0)
{ memset(readbuf,0,1000);
ReadFile(m_hCom2,readbuf,ComStat.cbInQue,&nLength,&olRead);
                    for(int i=0;i<ComStat.cbInQue;i++)
{   j=j+1;
if(readbuf[i]!=0x0a) 
recvbuffer[j]=readbuf[i];
else
{
recvbuffer[j]=readbuf[i];

   if(recvbuffer[0]=='a' && recvbuffer[1]=='b' && recvbuffer[2]=='c' && recvbuffer[3]=='d') 
   {
                                                 my_program();  //处理函数
 ::SendMessage(...);//发送消息                                               memset(recvbuffer,0,1000);
       j=-1;    
             }
                        
                               else       
{
                                           memset(recvbuffer,0,1000);
    j=-1;
}
}
       
}        
}      }
 

解决方案 »

  1.   

    这是问题
      m_hCom2=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL);既然制定了这个标志,最后一个参数就不能为空,把这个标志写成0试试看
      

  2.   

    错误提示就是  Access  :000005  。  具体我记不清了,现象就是一运行程序,就弹出错误框,
    由于数据量大而且非常快 我怀疑是不是串口接收缓冲区溢出了郁闷 ,不知哪里有问题,如何改
      

  3.   

    你的串口读操作有问题,你使用重叠IO口操作,ReadFile可能在读操作完成之前就返回
    而此时读操作还未完成,你操作缓存数组就可能出问题
    bool bResult = ReadFile(m_hCom2,readbuf,ComStat.cbInQue,&nLength,&olRead);if(!bResult ) //如果ReadFile函数返回FALSE{       if(GetLastError()==ERROR_IO_PENDING)       //GetLastError()函数返回ERROR_IO_PENDING,表明串口正在进行读操作       {              WaitForSingleObject(olRead.hEvent,2000);              //使用WaitForSingleObject函数等待,直到读操作完成或延时已达到2秒钟              //当串口读操作进行完毕后,olRead的hEvent事件会变为有信号,此时再读你的接收缓冲数组的内容              ......       }       return 0;}