通过以上这些函数和结构,我们就可以通过串口进行通讯了,现在我们具体看下面的实例:
    BOOL CSerial::Open( int nPort, int nBaud )
    {
    if( m_bOpened ) return( TRUE );
    char szPort[15];
    DCB dcb;
    wsprintf( szPort, "COM%d", nPort );
    m_hComDev = CreateFile( szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL );
    if( m_hComDev == NULL ) return( FALSE );
    memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) );
    memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) );
    COMMTIMEOUTS CommTimeOuts;
    CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
    CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
    CommTimeOuts.ReadTotalTimeoutConstant = 0;
    CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
    CommTimeOuts.WriteTotalTimeoutConstant = 5000;
    SetCommTimeouts( m_hComDev, &CommTimeOuts );
    m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
    m_OverlappedWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
    dcb.DCBlength = sizeof( DCB );
    GetCommState( m_hComDev, &dcb );
    dcb.BaudRate = nBaud;
    dcb.ByteSize = 8;
    if( !SetCommState( m_hComDev, &dcb ) ||
    !SetupComm( m_hComDev, 10000, 10000 ) ||
    m_OverlappedRead.hEvent == NULL ||
    m_OverlappedWrite.hEvent == NULL ){
    DWORD dwError = GetLastError();
    if( m_OverlappedRead.hEvent != NULL ) CloseHandle( m_OverlappedRead.hEvent );
    if( m_OverlappedWrite.hEvent != NULL ) CloseHandle( m_OverlappedWrite.hEvent );
    CloseHandle( m_hComDev );
    return FALSE;
    }
    m_bOpened = TRUE;
    return m_bOpened;
    }
    int CSerial::InBufferCount( void )
    {
    if( !m_bOpened || m_hComDev == NULL ) return( 0 );
    DWORD dwErrorFlags;
    COMSTAT ComStat;
    ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );
    return (int)ComStat.cbInQue;
    }
    DWORD CSerial::ReadData( void *buffer, DWORD dwBytesRead)
    {
    if( !m_bOpened || m_hComDev == NULL ) return 0;
    BOOL bReadStatus;
    DWORD dwErrorFlags;
    COMSTAT ComStat;
    ClearCommError( m_hComDev, &dwErrorFlags, &ComStat );
    if( !ComStat.cbInQue ) return 0;
    dwBytesRead = min(dwBytesRead,(DWORD) ComStat.cbInQue);
    bReadStatus = ReadFile( m_hComDev, buffer, dwBytesRead, &dwBytesRead, &m_OverlappedRead );
    if( !bReadStatus ){
    if( GetLastError() == ERROR_IO_PENDING ){
    WaitForSingleObject( m_OverlappedRead.hEvent, 2000 );
    return dwBytesRead;
    }
    return 0;
    }
    return dwBytesRead;
    }
    DWORD CSerial::SendData( const char *buffer, DWORD dwBytesWritten)
    {
    if( !m_bOpened || m_hComDev == NULL ) return( 0 );
    BOOL bWriteStat;
    bWriteStat = WriteFile( m_hComDev, buffer, dwBytesWritten, &dwBytesWritten, &m_OverlappedWrite );
    if( !bWriteStat){
    if ( GetLastError() == ERROR_IO_PENDING ) {
    WaitForSingleObject( m_OverlappedWrite.hEvent, 1000 );
    return dwBytesWritten;
    }
    return 0;
    }
    return dwBytesWritten;
    }
    上述函数基本实现串口的打开,读写操作,你就可以在你的程序中调用该串口类了


注意:本文归作者所有,未经作者允许,不得转载