Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / Languages / C++

CSerialIO - A Useful and Simple Serial Communication Class

4.86/5 (7 votes)
5 Aug 2010CPOL 175.4K   9.4K  
It implements the serial communication using a thread to enable data being captured anytime, you just handle the event of READ/WRITE/OPEN/CLOSE via inheriting this class

Introduction

I have searched a lot of samples supporting synchronous and asynchronous serial communication, but the drawback is that I need to implement a thread or a timer to always keep reading the serial data, so I encapsulated this serial communication class with a thread to make it easy to handle the event (READ/WRITE/OPEN/CLOSE) of accessing serial port.

The SerialCtrlDemo project illustrates how to use CSerialIO class and is easy to present the serial communication event information as depicted in the following UI:

SerialCtrl/serial.JPG

CSerialIO Class

The CSerialIO class is defined for external API and the primary methods listed below:

C++
class CSerialIO{ 
public: 
CSerialIO(); 
virtual ~CSerialIO(); 
void OpenPort(CString strPortName,CString strBaudRate);//open serial port with 
					//parameter port name and baud rate 
virtual void OnEventOpen(BOOL bSuccess);	//handle the event whether the port is 
					//successfully opened 
void ClosePort();//close serial port 
virtual void OnEventClose(BOOL bSuccess);	//handle the event whether the port 
					//is successfully closed 
virtual void OnEventRead(char *inPacket,int inLength);	//handle the received data 
						//from serial 
void Write(char *outPacket,int outLength);	// write data directly 
virtual void OnEventWrite(int nWritten); 	//handle the event of how many bytes 
					//have been written 
… 
}; 

How to Use CSerialIO Class

Take the following steps to use the CSerialIO class:

  1. Add the SerialCtrl.h & SerialCtrl.cpp files in your VC++ project.
  2. Add the line #include "SerialCtrl.h" in your dialog's header file.
  3. Inherit the CSerialIO class in your dialog.
  4. Handle the event (READ/WRITE/OPEN/CLOSE) in your dialog class via overwrite the virtual function.
C++
//Handle the event of opening serial port
void CSerialCtrlDemoDlg::OnEventOpen(BOOL bSuccess)
{
 CString str;
 if (bSuccess)
 {
  str=m_strPortName+" open successfully";
  bPortOpened=TRUE;
  m_btnOpen.SetWindowText("Close");  
 }
 else
 {
  str=m_strPortName+" open failed";
 }
 m_staticInfo.SetWindowText(str);
}

//handle the event of closing serial port
void CSerialCtrlDemoDlg::OnEventClose(BOOL bSuccess)
{
 CString str;
 if (bSuccess)
 {
  str=m_strPortName+" close successfully";
  bPortOpened=FALSE;
  m_btnOpen.SetWindowText("Open");
 }
 else
 {
  str=m_strPortName+" close failed";
 }
 m_staticInfo.SetWindowText(str);
}

//Handle the event of reading data from serial port
void CSerialCtrlDemoDlg::OnEventRead(char *inPacket,int inLength)
{ 
 m_listboxRead.AddString(inPacket);
 CString str;
 str.Format("%d bytes read",inLength);
 m_staticInfo.SetWindowText(str);
}

//Handle the event of writing data 
void CSerialCtrlDemoDlg::OnEventWrite(int nWritten)
{
 if (nWritten>0)
 {
  CString str;
  str.Format("%d bytes written",nWritten);
  m_staticInfo.SetWindowText(str);
 }
 else
 {
  m_staticInfo.SetWindowText("Write failed");
 }
}

Note

This code has been verified with RS-232 connector, and you can easily customize the event handler in run function of SerialThread class.

History

  • 5th August, 2010: Initial post

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)