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打开