在Visual Studio下使用MFC编写串口助手

Visual Studio 版本:2015

1、新建mfc项目

在Visual Studio下使用MFC编写串口助手_第1张图片

选择基于对话框类型:
在Visual Studio下使用MFC编写串口助手_第2张图片

其他设置选择默认,点击完成即可创建项目。
在Visual Studio下使用MFC编写串口助手_第3张图片

2、拖入控件,并设置界面
将多余的控件删除,添加按钮控件和编辑框。
在Visual Studio下使用MFC编写串口助手_第4张图片
在Visual Studio下使用MFC编写串口助手_第5张图片
在Visual Studio下使用MFC编写串口助手_第6张图片

最终界面

3、添加文件
想要使用端口,需要在我们的项目里面添加serialport.h文件和SerialPort.cpp文件
在Visual Studio下使用MFC编写串口助手_第7张图片
点击项目中的添加现有项目。
在Visual Studio下使用MFC编写串口助手_第8张图片
将这两个文件添加到项目中去。
在Visual Studio下使用MFC编写串口助手_第9张图片

在解决方案视图中可以看到,已经添加成功。
在Visual Studio下使用MFC编写串口助手_第10张图片
将头文件包含到项目源文件中。
在Visual Studio下使用MFC编写串口助手_第11张图片

在Visual Studio下使用MFC编写串口助手_第12张图片
4、串口的初始化

首先我们编写初始化串口号的函数。

int CSerial_port_testDlg::SerialInit(void)
{
	//	nPort=CSerialPort::FindSerialPort(); 
	unsigned int baudRate = 115200;  //设置波特率
	CString csnPort;
	csnPort.Format(TEXT("发送串口为com%d"), nPort);
	AfxMessageBox(csnPort);
	COMMCONFIG config;
	CSerialPort::GetDefaultConfig(nPort, config);
	//设置检验位、停止位、流控
	port.Open(nPort, baudRate, CSerialPort::EvenParity, 8, CSerialPort::OneStopBit, CSerialPort::NoFlowControl);   

	HANDLE hPort = port.Detach();
	port.Attach(hPort);

	DWORD dwModemStatus;
	port.GetModemStatus(dwModemStatus);

	DCB dcb;
	port.GetState(dcb);

	dcb.BaudRate = baudRate;
	port.SetState(dcb);

	DWORD dwErrors;
	port.ClearError(dwErrors);

	//port.SetBreak();
	//port.ClearBreak();

	COMSTAT stat;
	port.GetStatus(stat);

	DWORD dwBytesWaiting = port.BytesWaiting();
	dwBytesWaiting;

	COMMTIMEOUTS timeouts;
	port.GetTimeouts(timeouts);

	port.Setup(10000, 10000);

	port.GetConfig(config);

	config.dcb.BaudRate = baudRate;
	port.SetConfig(config);

	port.Set0WriteTimeout();
	port.Set0ReadTimeout();
	//////自收自发的范例代码///////	
	// 	port.ClearWriteBuffer();
	// 	port.ClearReadBuffer();
	// 	Sleep(100);
	// 	port.Write(sBuf, 7);
	// 	Sleep(100);
	// 	port.Read(rBuf,7);
	//////自收自发的范例代码///////
	return 0;
}

在文件前面将端口号定义出来,并将函数添加到Dlg类中。
在Visual Studio下使用MFC编写串口助手_第13张图片
在Visual Studio下使用MFC编写串口助手_第14张图片
添加编辑框变量
在Visual Studio下使用MFC编写串口助手_第15张图片

设置变量名
在Visual Studio下使用MFC编写串口助手_第16张图片
对于按钮也是同样的操作,添加变量,之后我们就可以通过这些变量来操纵这些按钮和编辑框。

双击进入初始化串口这个按钮,会自动生成点击函数,当点击该按钮时就会调用这个函数。
在Visual Studio下使用MFC编写串口助手_第17张图片
这样我们的串口初始化功能就完成了,接下来我们需要实现接收和发送数据的功能。

5、接收和发送数据功能的完成

先将我们的两个编辑框设置为多行模式
在Visual Studio下使用MFC编写串口助手_第18张图片

首先完成发送数据的功能。

发送数据其实很简单,使用port.write函数就可以完成,但是我们需要先从编辑框中获取我们的数据。

还是和之前一样我们将编辑框都添加好变量,便于之后的使用。

双击 ‘发送数据’ 按钮,进入点击事件。

void CSerial_port_testDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	CString str;
	char num[1024];
	int len, i;
	memset(num, 0, 1024);
	txt_frame2.GetWindowTextW(str);   //获取编辑框中的数据
	len = str.GetLength();            //设置长度
	for (i = 0; i < len; i++) {
		num[i] = str[i];              
	}
	
	port.Write(num, len);            //写入串口
}

在Visual Studio下使用MFC编写串口助手_第19张图片
现在完成接收数据的功能。

UINT CSerial_port_testDlg::RecvData(LPVOID param)
{
	unsigned char buf[1024];  //存放数据的缓冲区
	int frame_num,i;
	CString str;
	memset(buf, 0, sizeof(buf));
	
	while (recv_flag) {
		Sleep(1);
		frame_num = port.Read(buf, sizeof(buf));
		if (frame_num) {
			for (i = 0; i < frame_num; i++) {
				str.AppendFormat(_T("%d"), buf[i]);         //将数据连接在一起,便于之后的显示
			}
			theApp.m_pMainWnd->SetDlgItemText(IDC_EDIT3, str);  //在编辑框中显示对象中的内容
			memset(buf, 0, sizeof(buf));
		}
	}
	return 0;
}

在Visual Studio下使用MFC编写串口助手_第20张图片
编写接收数据按钮中的函数,创建线程。

void CSerial_port_testDlg::OnBnClickedButton3()
{
	// TODO: 在此添加控件通知处理程序代码
	if (flag) {
		flag = false;
		recv_flag = false;
		btn3.SetWindowTextW(TEXT("接 收"));
	}
	else {
		flag = true;
		recv_flag = true;
		//创建接收数据的线程
		btn3.SetWindowTextW(TEXT("停 止"));
		CWinThread *pUartSendThread = AfxBeginThread(RecvData, this);
	}
}

在Visual Studio下使用MFC编写串口助手_第21张图片
新增的相关变量。
在Visual Studio下使用MFC编写串口助手_第22张图片

类中函数和变量的定义。
在Visual Studio下使用MFC编写串口助手_第23张图片
注意,线程函数必须定义为静态函数,并且函数原型必须和图片上面的相同。

最终实现发送数据和接收数据的功能。

在Visual Studio下使用MFC编写串口助手_第24张图片

你可能感兴趣的:(MFC对话框编写,c++,mfc,vc++)