下面是一个使用 MFC 实现打开串口、关闭串口、读写数据以及清空缓冲区的例子:

#include "stdafx.h"
#include "SerialPortDemoDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

CSerialPortDemoDlg::CSerialPortDemoDlg(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_SERIALPORTDEMO_DIALOG, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CSerialPortDemoDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CSerialPortDemoDlg, CDialogEx)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_BTN_OPEN, &CSerialPortDemoDlg::OnBnClickedBtnOpen)
    ON_BN_CLICKED(IDC_BTN_CLOSE, &CSerialPortDemoDlg::OnBnClickedBtnClose)
    ON_BN_CLICKED(IDC_BTN_SEND, &CSerialPortDemoDlg::OnBnClickedBtnSend)
    ON_BN_CLICKED(IDC_BTN_CLEAR, &CSerialPortDemoDlg::OnBnClickedBtnClear)
END_MESSAGE_MAP()

BOOL CSerialPortDemoDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    SetIcon(m_hIcon, TRUE);         
    SetIcon(m_hIcon, FALSE);        

    m_serialPort.InitPort(this);

    return TRUE;
}

void CSerialPortDemoDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); 

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialogEx::OnPaint();
    }
}

HCURSOR CSerialPortDemoDlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}

void CSerialPortDemoDlg::OnBnClickedBtnOpen()
{
    CString portName;
    GetDlgItemText(IDC_EDIT_PORTNAME, portName);
    int baudRate = GetDlgItemInt(IDC_EDIT_BAUDRATE);
    if (m_serialPort.OpenPort(portName, baudRate))
    {
        MessageBox(_T("串口打开成功!"));
    }
    else
    {
        MessageBox(_T("串口打开失败!"));
    }
}

void CSerialPortDemoDlg::OnBnClickedBtnClose()
{
    m_serialPort.ClosePort();
    MessageBox(_T("串口已关闭!"));
}

void CSerialPortDemoDlg::OnBnClickedBtnSend()
{
    CString sendData;
    GetDlgItemText(IDC_EDIT_SEND, sendData);
    if (m_serialPort.WriteData(sendData))
    {
        MessageBox(_T("数据发送成功!"));
    }
    else
    {
        MessageBox(_T("数据发送失败!"));
    }
}

void CSerialPortDemoDlg::OnBnClickedBtnClear()
{
    m_serialPort.ClearBuffer();
    MessageBox(_T("缓冲区已清空!"));
}

上述代码是一个 MFC 对话框应用程序的主对话框类 CSerialPortDemoDlg 的实现。CSerialPortDemoDlg 类中的按钮点击事件处理函数对应了打开串口、关闭串口、发送数据和清空缓冲区的操作。

CSerialPortDemoDlg 类中使用了 CSerialPort 类来进行串口操作。CSerialPort 类封装了串口的打开、关闭、读写等功能。你需要在 CSerialPort 类中实现这些功能。以下是一个简单的 CSerialPort 类的示例:

class CSerialPort
{
public:
    CSerialPort();
    ~CSerialPort();

    BOOL InitPort(CWnd* pWnd);
    BOOL OpenPort(CString portName, int baudRate);
    void ClosePort();
    BOOL WriteData(CString data);
    void ClearBuffer();

private:
    HANDLE m_hComm;
    CWnd* m_pWnd;
    char m_recvBuffer[1024];
    int m_recvCount;

    static UINT ReadThread(LPVOID pParam);
};

在上述 CSerialPort 类中,InitPort 方法用于初始化串口,OpenPort 方法用于打开串口,ClosePort 方法用于关闭串口,WriteData 方法用于向串口写入数据,ClearBuffer 方法用于清空接收缓冲区。此外,CSerialPort 类还包含一个静态方法 ReadThread,用于读取串口收到的数据。

以上是一个简单的 MFC 串口操作的示例。你可以根据自己的需求进行修改和完善


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

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