Click here to Skip to main content
15,881,757 members
Articles / Programming Languages / C++

CSerialIO - A Useful and Simple Serial Communication Class

Rate me:
Please Sign up or sign in to vote.
4.86/5 (7 votes)
5 Aug 2010CPOL 174K   9.4K   44   10
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)


Written By
Engineer
China China
I am a software engineer with programming experience C/C++, MFC/Win32,Assembler(C51/ARM),Java and work in Science Park of ShenZhen City,the global manufacturer center,in China.
I like pingpong,basketball,bowling and table tennis sport.

Comments and Discussions

 
Questionwrite function Pin
Member 147934575-Jun-20 8:51
Member 147934575-Jun-20 8:51 
QuestionHow to open and handle multi ports? Pin
Bill Lee Vn12-Feb-15 15:50
Bill Lee Vn12-Feb-15 15:50 
Questioncan not show inPacket in listbox Pin
liunan_201012-Dec-11 3:47
liunan_201012-Dec-11 3:47 
QuestionUnable to read.............. Pin
P S D21-Jul-11 23:31
P S D21-Jul-11 23:31 
AnswerRe: Unable to read.............. Pin
swchou_nu8-Jan-19 18:38
swchou_nu8-Jan-19 18:38 
Generaldoubt in A Useful and Simple Serial Communication Class Pin
steven8Gerrard28-May-11 1:09
steven8Gerrard28-May-11 1:09 
General不能设置波特率 还有串口时延很长 Pin
PLA70110-Feb-11 23:04
PLA70110-Feb-11 23:04 
Generalusing SerialIO class in win32 application Pin
Member 446051218-Jan-11 20:44
Member 446051218-Jan-11 20:44 
GeneralDetected memory leaks Pin
GuKaKa-CC3-Jan-11 21:00
GuKaKa-CC3-Jan-11 21:00 
Smile | :)
AnswerRe: Detected memory leaks - Fixed Pin
Steve Mayfield5-Mar-11 18:26
Steve Mayfield5-Mar-11 18:26 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.