hCOM = CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);
DCB dCB;
!GetCommState(hCOM, &dCB);
dCB.BaudRate = 38400;
dCB.ByteSize = 8;
dCB.Parity = NOPARITY;
dCB.StopBits = ONESTOPBIT;
SetCommState(hCOM, &dCB);
...char strBuffer[1024];
ZeroMemory( strBuffer,sizeof(strBuffer) );
DWORD dwReadNum;
ReadFile(hCOM, strBuffer, 1024, &dwReadNum, NULL);读完以后strBuffer中实际内容和dwReadNum不符,WHY?

解决方案 »

  1.   

    当然,ReadFile并不是读完你所要求的字节数才返回的,这个函数在一定超时值后没有读到数据后就返回,你在配置串口属性的时候可以调整超时值来控制是否在未读全之前返回。
      

  2.   

    To:yrj(机枪) 
    请看清楚我的问题,是读完以后strBuffer中实际内容和dwReadNum不符
      

  3.   

    不知道是不是这样的啊!byte* pBuff=new byte[1024]
    memset(pBuff,0,1024);
    UINT READ=0;
    While(Read<theFIle.GetLength())
    {UINT temp=0;
    temp=theFile.Read(pBuff,1024);
    .
    .
    .
    Read+=temp;}一般一次读1024字节,
    而TEMP返回的是实际读的字节数!
      

  4.   

    你怎么判断strBuffer中实际内容和dwReadNum不符,用strlen(strBuffer)==dwReadNum ?
    如果是这样判断应该有问题,因为你读出来的数据中,可能有0的。而strlen()是以0为结束的字符串长度
      

  5.   

    是这么一回事,如果你的串口里面没有1024个字符在缓冲区,肯定会有这种错误的,应该在前面设置一个OVERLAPPED m_ovelap
    然后
    ClearCommError(...,m_ovelap)//忘了
    m_ovelap.InQue里面放的就是当前串口中用的字符串
      

  6.   

    我没有遇见过这样的问题,我做过很多串口通讯的程序,一般来讲,我以dwReadNum的返回的数值为准,来确定读到的正确数据。
    第二,建议不要使用CFile类实现串口通讯,会出问题的。
      

  7.   

    补充一句,是同步模式,没有使用重叠结构,我没有使用CFile,直接使用的API,也没有通过strlen去取长度,我在调试状态下直接看的内存内容。
      

  8.   

    你是不说,你获得到缓冲区中的数据长度和deReadNum中的值不一样呀
      

  9.   

    比如说,deReadNum为43,但strBuffer从第24个元素开始就是0x00了。
      

  10.   

    你这样测试一下,用memset把缓冲区都设置成65(大写字母A),然后读,如果发现仍然从24开始就是0了,那么说明读入的数据确实是0,如果是A,那说明其他的地方有问题。
      

  11.   

    同步方式 同步方式中,读串口的函数试图在串口的接收缓冲区中读取规定数目的数据,直到规定数目的数据全部被读出或设定的超时时间已到时才返回。例如: COMMTIMEOUTS timeOver;
    memset(&&timeOver,0,sizeof(timeOver));
    DWORD timeMultiplier,timeConstant;
    timeOver.ReadTotalTimeoutMultiplier=timeMultiplier;
    timeOver.ReadTotalTimeoutConstant=timeConstant;
    SetCommTimeouts(hComport,&&timeOver);
    ……
    ReadFile(hComport,inBuffer,nWantRead,&&nRealRead,NULL); COMMTIMEOUTS结构用于设置读写函数的等待时间。 在ReadFile函数中hComport为待读串口句柄;inBuffer为输入缓冲区大小;nWantRead为每次调用ReadFile时,函数试图读出的字节数;nRealRead为实际读出的字节数;最后一个参数值NULL代表ReadFile将采用同步文件读写的方式。 如果所规定的待读取数据的数目nWantRead较大且设定的超时时间也较长,而接收缓冲区中数据较少,则可能引起线程阻塞。解决这一问题的方法是检查COMSTAT结构的cbInQue成员,该成员的大小即为接收缓冲区中处于等待状态的数据的实际个数。如果令nWantRead的值等于COMSTAT.cbInQue,就能较好地防止线程阻塞。
      

  12.   

    兄弟们帮帮忙,不是超时问题,是读完以后数据长度不符,另外补充一句,是通过串口和Modem通讯。
      

  13.   

    搂主读到的数据中应该含有两个收发Modem之间通信的控制字(所以不符),似乎是Modem内部硬件将信号电平置上置下的控制字符。对有些Modem是1~2个空字符。
      

  14.   

    晕,原来是和MODEM通讯的,你怎么和MODEM通讯的,什么速度,MODEM是自适应速度的,你需要用“AT”字符串做速度匹配的,试试在你传输数据的数据前面加个“AT”字符串