我编了一个通讯类,其中有初始化串口的函数,里面用了::BuildCommDCB()函数,现遇到一个比较奇怪的问题,请大伙帮忙看看:
我在应用类中定义一个通讯变量,在InitInstance()函数中打开串口后通讯都是正常的,但到文档类中做同样的操作通讯就不成功。后来我查了一下,发现是初始化时用BuildCommDCB()得到的dcb结构中有无效的参数,所以用SetCommState()设置串口参数不成功,而在应用类中初始化时是正常的,小的百思不的其解,不知道有没有人遇到过这种问题?

解决方案 »

  1.   

    你打开的串口句柄是否是在你的程序中是全局的?是不是在SetCommState()时的句柄就已经失效了
      

  2.   

    m_hComm=CreateFile(ComName,
    GENERIC_READ|GENERIC_WRITE,
    0,//exclusive access
    NULL,//no security attrs
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,//FILE_ATTRIBUTE_NORMAL,
    NULL);
    if(m_hComm==(HANDLE)0xFFFFFFFF)
    return FALSE; 
    if(EventMask>0){
    if(!::SetCommMask(m_hComm,EventMask))
    return FALSE;
    }
    if(!::SetupComm(m_hComm,m_dwInQueue,m_dwOutQueue))
    return FALSE;
        ::PurgeComm( m_hComm, PURGE_TXABORT | PURGE_RXABORT |
                                          PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
    // set up for overlapped I/O commset=p_sCommSet;
    if(!::BuildCommDCB(commset,&m_dcb))//这句有差异
    return FALSE;
    m_dcb.fParity=true;
    m_dcb.fBinary=true;
    ::SetCommState(m_hComm,&m_dcb);
      

  3.   

    哥们,你commset=p_sCommSet;是干什么用的,是不是commset失效了?
      

  4.   

    p_sCommSet是传进来的参数,commset是个局部变量
      

  5.   

    你说初"始化时用BuildCommDCB()得到的dcb结构中有无效的参数"能具体点不
      

  6.   

    传进来的p_sCommSet为COM1:1200,n,8,1,用BuildCommDCB(commset,&m_dcb))后,生成的m_dcb里面的有些参数不对,如m_dcb.DCBlength被初始化成很大的数,不是有效值,除了传进来的参数初始化正确外,其他大部分不正确。但在应用类中调用时初始化是正确的。
      

  7.   

    有点奇怪哦,对了,你为什么要BuildCommDCB呢,如果你要设置串口参数的话可以
    DCB  dcb;
       BOOL fsuccess;
       
       fsuccess = GetCommState(idComDev, &dcb);
       if (!fsuccess) return 0;
       
       dcb.BaudRate =baud_rate;
       dcb.ByteSize =8; //number of bits/byte, 4-8 
       dcb.Parity =NOPARITY;
       dcb.StopBits =ONESTOPBIT;
       dcb.EvtChar=0x02;
       /*
       dcb.fOutxCtsFlow = 1;
       dcb.fDtrControl = 1;
       dcb.fRtsControl = 2;
       dcb.EofChar = 0;
       */
       dcb.fOutxCtsFlow = 0;
       dcb.fDtrControl = 0;
       dcb.fRtsControl = 2;
       dcb.EofChar = 0;
       //dcb.fNull=TRUE;   fsuccess=SetCommState(idComDev, &dcb);
       if (!fsuccess) return 0;
    啊 我初始化设置都是用SetCommState的,还真没用过BuildCommDCB,这里是不是不应该这么用阿
      

  8.   

    BuildCommDCB()只是构造dcb,设置是用SetCommState(),因为dcb中含有无效参数,所以fsuccess=SetCommState(idComDev, &dcb)设置不成功。
      

  9.   

    我觉得dcb.BaudRate =baud_rate;
       dcb.ByteSize =8; //number of bits/byte, 4-8 
       dcb.Parity =NOPARITY;
       dcb.StopBits =ONESTOPBIT;
       dcb.EvtChar=0x02;
       /*
       dcb.fOutxCtsFlow = 1;
       dcb.fDtrControl = 1;
       dcb.fRtsControl = 2;
       dcb.EofChar = 0;
       */
       dcb.fOutxCtsFlow = 0;
       dcb.fDtrControl = 0;
       dcb.fRtsControl = 2;
       dcb.EofChar = 0;
       //dcb.fNull=TRUE;
    这样直接赋值就可以了吧
      

  10.   

    可能和程序运行的先后有关系,我没有见到你的程序。。可能程序在什么地方有很微小不易察觉的BUG