我是龚建伟编写的《《Visual C++/Turbo C串口通信编程实践(第2版)》》按照这边书第二章,用多线程串口编程工具CSerialPort类实现串口通信:
下图是做好的界面
具体步骤我是按书的要求一步步的做的:
首先,基于MFC Wizard 创建一个基于对话框的应用程序;
接着添加类文件CSerailPort.cpp 和 CSerailPort.h 两个文件;
然后就是添加串口响应函数:代码如下红色部分
这是对话框.cpp文件里的消息映射
- BEGIN_MESSAGE_MAP(CSerialComDlg, CDialog)
- ON_WM_SYSCOMMAND()
- ON_WM_PAINT()
- ON_WM_QUERYDRAGICON()
- //}}AFX_MSG_MAP
- ON_BN_CLICKED(IDC_BUTTON1, &CSerialComDlg::OnBnClickedButton1)
- ON_MESSAGE(WM_COMM_RXCHAR,OnComm)
- ON_BN_CLICKED(IDC_BUTTON2, &CSerialComDlg::OnBnClickedButton2)
- END_MESSAGE_MAP()
这是在对话框.h文件里的需要添加的代码(红色部分)
- protected:
- HICON m_hIcon;
- // Generated message map functions
- virtual BOOL OnInitDialog();
- afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
- afx_msg void OnPaint();
- afx_msg LONG OnComm(WPARAM ch,LPARAM port);
- afx_msg HCURSOR OnQueryDragIcon();
- DECLARE_MESSAGE_MAP()
- public:
这是对应的OpenCom按钮函数
- void CSerialComDlg::OnBnClickedButton1()
- {
- // TODO: Add your control notification handler code here
- int nPort = m_ctrComPort.GetCurSel() + 1;
- if (m_SerialPort.InitPort(this,nPort,9600,'N',8,1,EV_RXFLAG |
- EV_RXCHAR,512))
- {
- m_SerialPort.StartMonitoring();
- m_bSerialPortOpened = true;
- closing = true;
- }
- else
- {
- AfxMessageBox("Cann't Open this Comm Port");
- m_bSerialPortOpened = false;
- }
- GetDlgItem(IDC_BUTTON1)->EnableWindow(!m_bSerialPortOpened);
- GetDlgItem(IDC_BUTTON2)->EnableWindow(m_bSerialPortOpened);
- }
这是对应的CloseCom按钮函数
- void CSerialComDlg::OnBnClickedButton2()
- {
- // TODO: Add your control notification handler code here
- m_SerialPort.ClosePort();
- m_bSerialPortOpened = FALSE;
- GetDlgItem(IDC_BUTTON1)->EnableWindow(!m_bSerialPortOpened);
- GetDlgItem(IDC_BUTTON2)->EnableWindow(m_bSerialPortOpened);
- }
问题:当我按下OpenCom按钮后,开始接收数据,程序正常工作;但是当我按下CloseCom时,再重新按OpenCom时程序出现问题、电脑也像死机一样。
望那位高手解决这个问题!