65.9K
CodeProject 正在变化。 阅读更多。
Home

CSerialIO - 一个有用且简单的串行通信类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (7投票s)

2010年8月5日

CPOL
viewsIcon

176332

downloadIcon

9457

它使用线程实现串口通信,以便随时捕获数据,你只需通过继承该类来处理 READ/WRITE/OPEN/CLOSE 事件。

引言

我搜索了许多支持同步和异步串口通信的示例,但缺点是需要实现一个线程或定时器来始终读取串口数据,所以我将这个串口通信类封装在一个线程中,以便更容易地处理访问串口的事件(READ/WRITE/OPEN/CLOSE)。

SerialCtrlDemo 项目演示了如何使用 CSerialIO 类,并且可以轻松地以以下UI所示的方式呈现串口通信事件信息。

SerialCtrl/serial.JPG

CSerialIO 类

CSerialIO 类是为外部 API 定义的,下面列出了主要方法。

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 
… 
}; 

如何使用 CSerialIO 类

按照以下步骤使用 CSerialIO 类:

  1. SerialCtrl.h & SerialCtrl.cpp 文件添加到你的 VC++ 项目中。
  2. 在你的对话框的头文件中添加一行 #include "SerialCtrl.h"
  3. 在你的对话框中继承 CSerialIO 类。
  4. 通过重写虚拟函数,在你的对话框类中处理事件(READ/WRITE/OPEN/CLOSE)。
//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");
 }
}

注意

此代码已使用 RS-232 连接器进行验证,你可以轻松地自定义 SerialThread 类运行函数中的事件处理程序。

历史

  • 2010年8月5日:初始发布
© . All rights reserved.