User ID:
Password:
Remember Me:
Forgot Password?
Not a member?
Click here for more information and to register.

    A communication class for serial port



    In the newgroups there are many questions about serial communication so I thought: make it public! It's freeware. The only thing I expect from users is that they drop me a mail. All modifications on this class are free, but please let me know if it solves a bug or adds some good features. Also comment your code and don't let me solve your bugs!

    Target:

    The class is not intended to use as a baseclass for modemcommunication but more for driving hardware or reading hardware via the serial port.

    From the classes included there is only one class important: CSerialPort. The other classes are only there to illustrate the use of this class.

    Usage:

    In your software you only need to create an instance of the CSerialPort class and call InitPort.
    // the owner (CWnd) of the port (receives message)
    
    BOOL CSerialPort::InitPort(CWnd* pPortOwner,  
     UINT  portnr,   // portnumber (1..4)
     UINT  baud,    // baudrate
     char  parity,   // parity 
     UINT  databits,   // databits 
     UINT  stopbits,   // stopbits 
     DWORD dwCommEvents,  // EV_RXCHAR, EV_CTS etc
     UINT  writebuffersize) // size of the writebuffer
    

    The dwCommEvents flag can be used for communication with the owner of this class.

    The flags can be one of the following (or combined with |):

    • WM_COMM_BREAK_DETECTED A break was detected on input.
    • WM_COMM_CTS_DETECTED The CTS (clear-to-send) signal changed state.
    • WM_COMM_DSR_DETECTED The DSR (data-set-ready) signal changed state.
    • WM_COMM_ERR_DETECTED A line-status error occurred. Line-status errors are CE_FRAME, CE_OVERRUN, and CE_RXPARITY.
    • WM_COMM_RING_DETECTED A ring indicator was detected.
    • WM_COMM_RLSD_DETECTED The RLSD (receive-line-signal-detect) signal changed state.
    • WM_COMM_RXCHAR A character was received and placed in the input buffer.
    • WM_COMM_RXFLAG_DETECTED The event character was received and placed in the input buffer.

    Accept the first parameter all parameters are optional. The standard values are:

    portnr  = 1
    baud  = 19200
    parity  = 'N'
    databits  = 8, 
    stopsbits = 1, 
    dwCommEvents = EV_RXCHAR | EV_CTS,
    nBufferSize = 512);
    

    So the follwing code is enough to make communication possible:

    in the header of the owner:

     CSerialPort m_Serial;
    

    in the code:

     m_Serial.InitPort(this);
     m_Serial.StartMonitoring();
    

    Then the tread that watches the port is started and all events on the port are send to the owner. The receive a character the owner needs a messageentry in the messagemap:

    BEGIN_MESSAGE_MAP(CCommtestDlg, CDialog)
     //{{AFX_MSG_MAP(CCommtestDlg)
     ON_MESSAGE(WM_COMM_RXCHAR, OnCommunication)
     ON_MESSAGE(WM_COMM_CTS_DETECTED, OnCTSDetected)
     //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    and they must be handled:
    LONG CCommtestDlg::OnCommunication(WPARAM ch, LPARAM port)
    {
     // do something with the received character
    
     return 0;
    }
    

    This is it for reading. Writing can be done with WriteChar or WriteToPort

    Downloads

    Download sample project - 66K

    IT Offers


    Top Authors