Visual Studio 版本:2015
1、新建mfc项目
2、拖入控件,并设置界面
将多余的控件删除,添加按钮控件和编辑框。
最终界面
3、添加文件
想要使用端口,需要在我们的项目里面添加serialport.h文件和SerialPort.cpp文件
点击项目中的添加现有项目。
将这两个文件添加到项目中去。
在解决方案视图中可以看到,已经添加成功。
将头文件包含到项目源文件中。
首先我们编写初始化串口号的函数。
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类中。
添加编辑框变量
设置变量名
对于按钮也是同样的操作,添加变量,之后我们就可以通过这些变量来操纵这些按钮和编辑框。
双击进入初始化串口这个按钮,会自动生成点击函数,当点击该按钮时就会调用这个函数。
这样我们的串口初始化功能就完成了,接下来我们需要实现接收和发送数据的功能。
5、接收和发送数据功能的完成
首先完成发送数据的功能。
发送数据其实很简单,使用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); //写入串口
}
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;
}
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);
}
}
类中函数和变量的定义。
注意,线程函数必须定义为静态函数,并且函数原型必须和图片上面的相同。
最终实现发送数据和接收数据的功能。