下面是一个使用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对话框对象并显示出来。

请注意,此代码是一个简化的例子,可能需要根据实际需求进行更多的错误处理和参数设置

MFC写一个例子要求实现打开串口关闭串口读写数据

原文地址: http://www.cveoy.top/t/topic/iTNc 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录