您当前的位置: 首页 > 

txwtech

暂无认证

  • 2浏览

    0关注

    813博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

MFC win32 API串口异步模式代码示范 vs2015

txwtech 发布时间:2019-06-28 18:26:50 ,浏览量:2

MFC win32 API串口异步模式代码示范   vs2015

本程序为单步接收,即点击接收按钮,才能收到消息。

实时循环接收需要添加线程

参考实例:

https://blog.csdn.net/txwtech/article/details/90286601

初始化位置:

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

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	m_Combo.AddString("COM1"); //新添加的//2019.6.28
	m_Combo.AddString("COM2");
	m_Combo.AddString("COM3");
	m_Combo.AddString("COM4");

	// TODO: 在此添加额外的初始化代码
	


	

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

选中组合框后,触发事件:

void CMFC_Win32API_YIBU_SerialPortCommDlg::OnCbnSelchangeCombo1()
{
	// TODO: 在此添加控件通知处理程序代码
	CString com;
	m_Combo.GetWindowText(com);
	handleFile = CreateFile(com, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);//FILE_FLAG_OVERLAPPED是,重叠方式,异步串口。如果是0,则是同步串口。
	if (handleFile == INVALID_HANDLE_VALUE)
	{
		MessageBox("Error in CreateFle");
		//return FALSE;
		return;

	}
	DCB dcb;
	GetCommState(handleFile, &dcb);
	dcb.BaudRate = 9600;
	dcb.ByteSize = 8;
	dcb.fParity = FALSE;
	dcb.StopBits = ONESTOPBIT;
	BOOL isTrue;
	isTrue = SetCommState(handleFile, &dcb);
	if (isTrue == FALSE)
	{
		MessageBox("串口设置失败");
		return;
	}
	//设置串口超时
	COMMTIMEOUTS timeous;
	timeous.ReadIntervalTimeout = 2000;
	isTrue = SetCommTimeouts(handleFile, &timeous);
	if (isTrue == FALSE)
	{
		MessageBox("串口设置超时");
		return;
	}
	SetupComm(handleFile, 1024, 1024);
	isTrue = PurgeComm(handleFile, PURGE_RXABORT | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR);
	if (isTrue == FALSE)
	{
		MessageBox("清除缓冲区操作失败");
		return;
	}

}

接收消息按钮:

void CMFC_Win32API_YIBU_SerialPortCommDlg::OnBnClickedButtonRecv()
{
	// TODO: 在此添加控件通知处理程序代码
	OVERLAPPED over;
	memset(&over,0,sizeof(OVERLAPPED));
	over.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
	DWORD dwError;
	COMSTAT comstat;
	ClearCommError(handleFile,&dwError,&comstat);
	char buff[1024];
	DWORD dword;
	BOOL isTrue = ReadFile(handleFile,buff,1024,&dword,&over);
	if(!isTrue)
	{
		if (GetLastError() == ERROR_IO_PENDING)
		{
			WaitForSingleObject(handleFile,2000);

		}
	}
	PurgeComm(handleFile,PURGE_RXABORT|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_TXCLEAR);
	m_Recv = buff;
	UpdateData(false);

}

发送按钮:

void CMFC_Win32API_YIBU_SerialPortCommDlg::OnBnClickedButtonSend()
{
	// TODO: 在此添加控件通知处理程序代码
	OVERLAPPED over;
	memset(&over,0,sizeof(OVERLAPPED));
	over.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
	DWORD dwordError;
	COMSTAT comstat;
	ClearCommError(handleFile,&dwordError,&comstat);
	UpdateData(true);
	DWORD dword;
	bool isTrue = WriteFile(handleFile,m_Send.GetBuffer(1),m_Send.GetLength()+1,&dword,&over);
	if (!isTrue)
	{
		if (GetLastError() == ERROR_IO_PENDING)
		{
			WaitForSingleObject(over.hEvent,1000);
		}
	}
}

群文件可以找到源代码:

MFC_Win32API_YIBU_SerialPortComm.rar

源文件下载: vs2015打开

 

关注
打赏
1665060526
查看更多评论
立即登录/注册

微信扫码登录

0.0599s