A communication class for serial port

CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More.

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

More by Author

Previous article
Next article

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read