串口编程中SerialPort类介绍以及应用

来源:互联网 发布:刺客信条叛变优化设置 编辑:程序博客网 时间:2024/05/22 10:43

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_MAPEND_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);//发送数据}




 

 


 

0 0
原创粉丝点击