使用MFC写一个串口通信
时间: 2023-06-20 18:05:56 浏览: 244
以下是一个简单的 MFC 应用程序,用于打开串口并发送和接收数据:
1. 创建一个 Win32 应用程序
在 Visual Studio 中,选择“新建项目”->“Visual C++”->“MFC 应用程序”。在向导中,选择“对话框”,然后单击“完成”。
2. 添加控件
在资源视图中,打开“对话框”资源。将一个“编辑框”和一个“按钮”拖放到对话框中。
3. 添加串口类
在“解决方案资源管理器”中,右键单击“头文件”文件夹,选择“添加”->“类”。在“添加类”对话框中,选择“MFC 类向导”,然后单击“下一步”。
在“类类型”页上,选择“MFC 类”,然后单击“下一步”。在“类名”页上,输入“CSerialPort”作为类名,然后单击“完成”。
4. 编写串口类
打开“CSerialPort.h”文件,并添加以下代码:
```c++
class CSerialPort
{
public:
CSerialPort();
virtual ~CSerialPort();
BOOL Open(LPCTSTR lpszPort, UINT nBaudRate);
void Close();
void Write(LPCTSTR lpszData);
CString Read();
protected:
HANDLE m_hComDev;
};
```
打开“CSerialPort.cpp”文件,并添加以下代码:
```c++
CSerialPort::CSerialPort()
{
m_hComDev = NULL;
}
CSerialPort::~CSerialPort()
{
Close();
}
BOOL CSerialPort::Open(LPCTSTR lpszPort, UINT nBaudRate)
{
if (m_hComDev != NULL)
return FALSE;
m_hComDev = CreateFile(lpszPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (m_hComDev == INVALID_HANDLE_VALUE)
return FALSE;
DCB dcb = { 0 };
dcb.DCBlength = sizeof(DCB);
if (!GetCommState(m_hComDev, &dcb))
return FALSE;
dcb.BaudRate = nBaudRate;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
if (!SetCommState(m_hComDev, &dcb))
return FALSE;
COMMTIMEOUTS timeouts = { 0 };
timeouts.ReadIntervalTimeout = 50;
timeouts.ReadTotalTimeoutConstant = 50;
timeouts.ReadTotalTimeoutMultiplier = 10;
if (!SetCommTimeouts(m_hComDev, &timeouts))
return FALSE;
return TRUE;
}
void CSerialPort::Close()
{
if (m_hComDev != NULL)
{
CloseHandle(m_hComDev);
m_hComDev = NULL;
}
}
void CSerialPort::Write(LPCTSTR lpszData)
{
DWORD dwWritten;
WriteFile(m_hComDev, lpszData, lstrlen(lpszData), &dwWritten, NULL);
}
CString CSerialPort::Read()
{
CString strData;
while (TRUE)
{
char chData;
DWORD dwRead;
if (!ReadFile(m_hComDev, &chData, 1, &dwRead, NULL))
break;
if (dwRead == 0)
continue;
if (chData == '\n')
break;
strData += chData;
}
return strData;
}
```
5. 编写对话框类
打开“Dlg.h”文件,并添加以下代码:
```c++
#include "SerialPort.h"
class CDlg : public CDialogEx
{
public:
CDlg(CWnd* pParent = nullptr);
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX);
protected:
DECLARE_MESSAGE_MAP()
private:
CSerialPort m_SerialPort;
CString m_strSendData;
CString m_strRecvData;
public:
virtual BOOL OnInitDialog();
afx_msg void OnBnClickedButtonSend();
afx_msg void OnBnClickedButtonOpen();
afx_msg void OnBnClickedButtonClose();
};
```
打开“Dlg.cpp”文件,并添加以下代码:
```c++
CDlg::CDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_DIALOG, pParent)
{
}
void CDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_SEND, m_strSendData);
DDX_Text(pDX, IDC_EDIT_RECV, m_strRecvData);
}
BEGIN_MESSAGE_MAP(CDlg, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON_SEND, &CDlg::OnBnClickedButtonSend)
ON_BN_CLICKED(IDC_BUTTON_OPEN, &CDlg::OnBnClickedButtonOpen)
ON_BN_CLICKED(IDC_BUTTON_CLOSE, &CDlg::OnBnClickedButtonClose)
END_MESSAGE_MAP()
BOOL CDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
return TRUE;
}
void CDlg::OnBnClickedButtonSend()
{
UpdateData(TRUE);
if (m_SerialPort.Open(_T("COM1"), 9600))
{
m_SerialPort.Write(m_strSendData);
m_strRecvData = m_SerialPort.Read();
m_SerialPort.Close();
}
UpdateData(FALSE);
}
void CDlg::OnBnClickedButtonOpen()
{
UpdateData(TRUE);
if (m_SerialPort.Open(_T("COM1"), 9600))
{
AfxMessageBox(_T("串口已经打开"));
}
UpdateData(FALSE);
}
void CDlg::OnBnClickedButtonClose()
{
UpdateData(TRUE);
m_SerialPort.Close();
UpdateData(FALSE);
}
```
6. 运行应用程序
在“调试”菜单中选择“启动调试(F5)”,然后输入要发送的数据并单击“发送”按钮,即可发送和接收数据。
注意:在这个例子中,串口号是 COM1,波特率是 9600。如果您的串口号和波特率不同,请相应地更改代码。
阅读全文