CSerialIO - 一个有用且简单的串行通信类
它使用线程实现串口通信,以便随时捕获数据,你只需通过继承该类来处理 READ/WRITE/OPEN/CLOSE 事件。
引言
我搜索了许多支持同步和异步串口通信的示例,但缺点是需要实现一个线程或定时器来始终读取串口数据,所以我将这个串口通信类封装在一个线程中,以便更容易地处理访问串口的事件(READ
/WRITE
/OPEN
/CLOSE
)。
SerialCtrlDemo
项目演示了如何使用 CSerialIO
类,并且可以轻松地以以下UI所示的方式呈现串口通信事件信息。
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
类:
- 将 SerialCtrl.h & SerialCtrl.cpp 文件添加到你的 VC++ 项目中。
- 在你的对话框的头文件中添加一行
#include "SerialCtrl.h"
。 - 在你的对话框中继承
CSerialIO
类。 - 通过重写虚拟函数,在你的对话框类中处理事件(
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日:初始发布