MFC写一个例子要求实现打开串口关闭串口读写数据
下面是一个使用MFC实现打开串口、关闭串口、读写数据的例子:
#include "stdafx.h"
#include "SerialPort.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
CWinApp theApp;
using namespace std;
class CSerialPortDlg : public CDialogEx
{
public:
CSerialPortDlg(CWnd* pParent = nullptr)
: CDialogEx(IDD_SERIALPORT_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void DoDataExchange(CDataExchange* pDX) override
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_COMBO_PORT, m_comboPort);
DDX_Control(pDX, IDC_BUTTON_OPEN, m_btnOpen);
DDX_Control(pDX, IDC_BUTTON_CLOSE, m_btnClose);
DDX_Control(pDX, IDC_EDIT_SEND, m_editSend);
DDX_Control(pDX, IDC_EDIT_RECEIVE, m_editReceive);
DDX_Control(pDX, IDC_BUTTON_SEND, m_btnSend);
}
BOOL OnInitDialog() override
{
CDialogEx::OnInitDialog();
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
m_comboPort.AddString(_T("COM1"));
m_comboPort.AddString(_T("COM2"));
m_comboPort.AddString(_T("COM3"));
m_comboPort.AddString(_T("COM4"));
m_comboPort.SetCurSel(0);
m_btnOpen.EnableWindow(TRUE);
m_btnClose.EnableWindow(FALSE);
m_btnSend.EnableWindow(FALSE);
return TRUE;
}
afx_msg void OnBnClickedButtonOpen()
{
CString strPort;
m_comboPort.GetWindowText(strPort);
if (m_serialPort.OpenPort(strPort))
{
m_btnOpen.EnableWindow(FALSE);
m_btnClose.EnableWindow(TRUE);
m_btnSend.EnableWindow(TRUE);
}
else
{
AfxMessageBox(_T("Failed to open the serial port."));
}
}
afx_msg void OnBnClickedButtonClose()
{
m_serialPort.ClosePort();
m_btnOpen.EnableWindow(TRUE);
m_btnClose.EnableWindow(FALSE);
m_btnSend.EnableWindow(FALSE);
}
afx_msg void OnBnClickedButtonSend()
{
CString strSend;
m_editSend.GetWindowText(strSend);
if (!strSend.IsEmpty())
{
if (m_serialPort.WriteData(strSend))
{
m_editSend.SetWindowText(_T(""));
}
else
{
AfxMessageBox(_T("Failed to send data."));
}
}
}
afx_msg LRESULT OnSerialDataReceived(WPARAM wParam, LPARAM lParam)
{
CString strReceive = m_serialPort.ReadData();
m_editReceive.SetWindowText(strReceive);
return 0;
}
DECLARE_MESSAGE_MAP()
private:
CComboBox m_comboPort;
CButton m_btnOpen;
CButton m_btnClose;
CEdit m_editSend;
CEdit m_editReceive;
CButton m_btnSend;
CSerialPort m_serialPort;
};
BEGIN_MESSAGE_MAP(CSerialPortDlg, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON_OPEN, &CSerialPortDlg::OnBnClickedButtonOpen)
ON_BN_CLICKED(IDC_BUTTON_CLOSE, &CSerialPortDlg::OnBnClickedButtonClose)
ON_BN_CLICKED(IDC_BUTTON_SEND, &CSerialPortDlg::OnBnClickedButtonSend)
ON_MESSAGE(WM_SERIAL_DATA_RECEIVED, &CSerialPortDlg::OnSerialDataReceived)
END_MESSAGE_MAP()
BOOL CSerialPortApp::InitInstance()
{
CWinApp::InitInstance();
CSerialPortDlg dlg;
m_pMainWnd = &dlg;
dlg.DoModal();
return FALSE;
}
此示例中,我们使用了一个自定义的CSerialPort类,负责打开、关闭串口以及读写数据。CSerialPortDlg类是一个对话框类,其中包含了串口的相关控件,如下拉框选择串口号、打开串口按钮、关闭串口按钮、发送数据按钮以及用于输入发送数据和显示接收数据的编辑框。
在CSerialPortDlg类中,我们通过CSerialPort类的OpenPort函数打开串口,ClosePort函数关闭串口,WriteData函数写入数据,ReadData函数读取数据。当接收到串口数据时,通过OnSerialDataReceived函数处理并显示在接收数据的编辑框中。
在CSerialPortApp类的InitInstance函数中,我们创建了一个CSerialPortDlg对话框对象并显示出来。
请注意,此代码是一个简化的例子,可能需要根据实际需求进行更多的错误处理和参数设置
原文地址: http://www.cveoy.top/t/topic/iTNc 著作权归作者所有。请勿转载和采集!