MFC写一个例子要求实现打开串口和关闭串口读写数据清空缓冲区
下面是一个使用 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 著作权归作者所有。请勿转载和采集!