SerialPort类的源代码已经放在下面,SerialPort类是由Remon Spekreijse提供的免费串口类。
CSerialPort支持线连接的串口编程,而且是基于多线程的,工作流程:
1.设置串口参数。
函数原型:
BOOL CSerialPort::InitPort(CWnd* pPortOwner, // the owner (CWnd) of the port (receives message)
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 to the writebuffer
2.串口监测线程。
BOOL CSerialPort::StartMonitoring()
BOOL CSerialPort::RestartMonitoring()
BOOL CSerialPort::StopMonitoring()
void CSerialPort::WriteChar(CSerialPort* port)
void CSerialPort::ReceiveChar(CSerialPort* port, COMSTAT comstat)
void CSerialPort::WriteToPort(char* string)
3.监测线程接收事件信息,再进行消息处理即可。
SerialPort类的应用
基于对话框的串口程序开发:
1.将SerialPort类添加进工程;
2.进行消息的映射;
(注意:在SerialPort类的头文件中的:
#define WM_COMM_RXCHAR WM_USER+7
需要手动进行映射)
在工程的主对话框头文件中,格式如下:
afx_msg LONG OnComm(WPARAM ch,LPARAM port);
在工程的主对话框的CPP文件中,格式如下:
BEGIN_MESSAGE_MAP(CMy20040889SerialPortTestDlg, CDialog)
//{{AFX_MSG_MAP(CMy20040889SerialPortTestDlg)
ON_MESSAGE(WM_COMM_RXCHAR,OnComm)
...
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
然后在CPP中添加消息处理函数,本例中为OnComm。
例如:
LONG CTestDlg::OnComm(WPARAM ch, LPARAM port)
{
m_strEditReceiveMsg += ch;
UpdateData(FALSE);
return 0;
}
//m_strEditReceiveMsg 为EDIT控件(接收框)的变量。
//下面的m_strEditSendMsg同样处理。
3.实现串口的初始化,打开/关闭串口按钮的响应函数,最后是发送信息按钮的函数实现。
void CTestDlg::OnButtonOpen()
{
int nPort=m_ctrlComboComPort.GetCurSel()+1;
if(m_SerialPort.InitPort(this, nPort, 9600,'N',8,1,EV_RXFLAG | EV_RXCHAR,512))
{
m_SerialPort.StartMonitoring();
m_bSerialPortOpened=TRUE;
}
else
{
AfxMessageBox("没有发现此串口或被占用");
m_bSerialPortOpened=FALSE;
}
GetDlgItem(IDC_BUTTON_OPEN)->EnableWindow(!m_bSerialPortOpened);
GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(m_bSerialPortOpened);
}
void CTestDlg::OnButtonClose()
{
m_SerialPort.ClosePort();
m_bSerialPortOpened=FALSE;
GetDlgItem(IDC_BUTTON_OPEN)->EnableWindow(!m_bSerialPortOpened);
GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(m_bSerialPortOpened);
}
void CTestDlg::OnButtonSend()
{
if(!m_bSerialPortOpened) return; UpdateData(TRUE); //读入编辑框中的数据
m_SerialPort.WriteToPort((LPCTSTR)m_strEditSendMsg);//发送数据
}