请问在Dev C++中如何动态设定串口接受缓冲区的大小.

解决方案 »

  1.   

    //打开串口
    BOOL CSerialWatch::OpenComm()
    {
    if (m_bOpened)
    CloseComm();
    ::memset(&m_olWait,0,sizeof(m_olWait));
    ::memset(&m_olRead,0,sizeof(m_olRead));
    ::memset(&m_olWrite,0,sizeof(m_olWrite));
    ::memset(&m_RxBuffer,0,sizeof(m_RxBuffer));
    ResetEvent(m_hExitEvent); //打开指定的串口,并初始化参数。
    DWORD dwErr;
    DCB dcb;
    COMMTIMEOUTS CommTimeOuts; 
    CString strName; strName.Format("\\\\.\\COM%d",m_iCommNo); //创建端口
    m_hComm = CreateFile(strName,
    GENERIC_READ|GENERIC_WRITE,
    0,
    NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
    NULL);
    if (INVALID_HANDLE_VALUE == m_hComm)
    {
    dwErr = ::GetLastError();
    ::AfxTrace("****ErrorCode %d Found in CSerialWatch::OpenComm****",dwErr);
    return FALSE;
    }
    //通信端口的现存状态和I/O缓冲区
    if(!::PurgeComm(m_hComm,
    PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR))
    {
    dwErr = ::GetLastError();
    ::AfxTrace("****ErrorCode %d Found in CSerialWatch::OpenComm****",dwErr);
    return FALSE;
    } //设置收发缓冲
    if(!::SetupComm(m_hComm,BUFFER_IN_SIZE,BUFFER_OUT_SIZE))
    {
    dwErr = ::GetLastError();
    ::AfxTrace("****ErrorCode %d Found in CSerialWatch::OpenComm****",dwErr);
    return FALSE;
    } //设置端口
    if(!::GetCommState(m_hComm,&dcb))
    {
    dwErr = ::GetLastError();
    ::AfxTrace("****ErrorCode %d Found in CSerialWatch::OpenComm****",dwErr);
    return FALSE;
    } dcb.BaudRate =m_iBaudRate;
    dcb.ByteSize=m_iDataBits; int iStopBits=m_fStopBits*2;
    switch(iStopBits)
    {
    case 2:
    dcb.StopBits=ONESTOPBIT;
    break;
    case 3:
    dcb.StopBits=ONE5STOPBITS;
    break;
    case 4:
    dcb.StopBits=TWOSTOPBITS;
    break;
    default:
    break;
    } switch(m_cParity)
    {
    case 'J':
    dcb.fParity=true; 
    dcb.Parity=ODDPARITY;
    break;
    case 'O':
    dcb.fParity=true; 
    dcb.Parity=EVENPARITY;
    break;
    case 'N':
    dcb.fParity=false;
    dcb.Parity=NOPARITY;
    break;
    default:
    break;
    }
    if(!::SetCommState(m_hComm,&dcb))
    {
    dwErr = ::GetLastError();
    ::AfxTrace("****ErrorCode %d Found in CSerialWatch::OpenComm****",dwErr);
    return FALSE;
    } //设置通信超时属性
    CommTimeOuts.ReadIntervalTimeout = 100;
    CommTimeOuts.ReadTotalTimeoutConstant = 0;
    CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
    CommTimeOuts.WriteTotalTimeoutConstant = 0;
    CommTimeOuts.WriteTotalTimeoutMultiplier = 0; if(!::SetCommTimeouts(m_hComm,&CommTimeOuts))
    {
    dwErr = ::GetLastError();
    ::AfxTrace("****ErrorCode %d Found in CSerialWatch::OpenComm****",dwErr);
    return FALSE;
    }; //初始化Overlapped参数
    m_olWait.hEvent = ::CreateEvent(NULL,TRUE,FALSE,NULL);
    if (NULL == m_olWait.hEvent)
    {
    dwErr = ::GetLastError();
    ::AfxTrace("****ErrorCode %d Found in CSerialWatch::OpenComm****",dwErr);
    return FALSE;
    } m_olRead.hEvent = ::CreateEvent(NULL,TRUE,FALSE,NULL);
    if (NULL == m_olRead.hEvent)
    {

    ::CloseHandle(m_olWait.hEvent);
    dwErr = ::GetLastError();
    ::AfxTrace("****ErrorCode %d Found in CSerialWatch::OpenComm****",dwErr);
    return FALSE;
    }

    m_olWrite.hEvent = ::CreateEvent(NULL,TRUE,TRUE,NULL);
    if (NULL == m_olWrite.hEvent)
    {
    ::CloseHandle(m_olWait.hEvent);
    ::CloseHandle(m_olRead.hEvent);
    dwErr = ::GetLastError();
    ::AfxTrace("****ErrorCode %d Found in CSerialWatch::OpenComm****",dwErr);
    return FALSE;
    } if (!::SetCommMask(m_hComm,EV_ERR|EV_RXCHAR))
    {
    dwErr = ::GetLastError();
    ::AfxTrace("****ErrorCode %d Found in CSerialWatch::OpenComm****",dwErr);
    return FALSE;
    } //创建监视线程
    DWORD dwThreadId;
        char szMsg[80]; m_hThread = ::CreateThread( 
            NULL,                        // no security attributes 
            0,                           // use default stack size  
            ThreadFunc,                  // thread function 
            this,                // argument to thread function 
            0,                           // use default creation flags 
            &dwThreadId);

    if (m_hThread == NULL) 
    {
      wsprintf( szMsg, "CreateThread failed." ); 
      MessageBox( NULL, szMsg, "main", MB_OK );
    };
    m_bOpened=true;
    return TRUE;
    }