利用MFC建立一个单文档程序。注意自动创建时,一下条目不选中:隐藏工具栏,初始化状态栏。,视类以CeditView类作为基类。
界面设计,设置一个对话框,进行串口设置。
在菜单项中添加一个“通信”菜单,添加三个命令子菜单,分别是“串口设置”、“打开串口”、“关闭串口”。
变量声明:先在视图类中添加#include "SetupDlg.h";#include "MainFrm.h"。
然后再视图类的public区声明如下变量:
HANDLE hCom; //串口句柄
OVERLAPPED Wol; //写操作OVERLAPPED结构变量
BYTE myWByte[300]; //存放欲写的数据
long dataWLen; //发送数据的长度
CSetupDlg mySetupDlg; //声明设置对话框实例
LPCTSTR myCom; //串口声明
BYTE myParity; //串口名称
DWORD myfParity; //奇偶校验位
DWORD myBaudRate; //是否使用奇偶校验位
bool blnOpened; //串口已经打开标志
串口设置函数中参数设置先隔过去,代码比较多。
void CTTYSendApiView::OnSetupcom() //设置串口消息处理
{
// TODO: Add your command handler code here
CString strStatus;
mySetupDlg.DoModal();
}
利用MFC的ClassWizard添加打开串口,关闭串口,字符处理的消息处理:
void CTTYSendApiView::OnOpencom() //打开串口消息处理
{
// TODO: Add your command handler code here
CString strDis;
hCom=CreateFile (myCom, //创建串口
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, //使用重叠方式
NULL);
if(hCom!=INVALID_HANDLE_VALUE)
{
SetupComm(hCom,1024,512);
DCB myDCB;
GetCommState(hCom,&myDCB);
myDCB.BaudRate=CBR_9600;
myDCB.fBinary=TRUE;
myDCB.fParity=false;
myDCB.ByteSize=8;
myDCB.Parity=NOPARITY;
myDCB.StopBits=ONESTOPBIT;
SetCommState(hCom,&myDCB);
AfxMessageBox("串口打开成功");
blnOpened=true;
}
else
{
AfxMessageBox("串口打开失败");
blnOpened=false;
}
}
void CTTYSendApiView::OnClosecom() //关闭串口消息处理
{
// TODO: Add your command handler code here
if((blnOpened) && (hCom!=NULL))
{
CloseHandle(hCom);
AfxMessageBox("串口已经关闭!");
blnOpened=false;
}
else
{
AfxMessageBox("串口未打开!");
}
}
//为捕捉键盘的输入,可以使用OnChar事件
void CTTYSendApiView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) //键盘输入字符处理
{
// TODO: Add your message handler code here and/or call default
myWByte[0]=nChar;
dataWLen=1;
Wol.Internal=0; //设置OVERLAPPED结构Wol
Wol.InternalHigh=0;
Wol.Offset=0;
Wol.OffsetHigh=0;
Wol.hEvent=CreateEvent(NULL, //设置hEvent为无信号状态
TRUE,
FALSE,
NULL);
WriteFile(hCom,&myWByte,dataWLen,NULL,&Wol); //发送字符
Beep(1000,10); //声音提示
CEditView::OnChar(nChar, nRepCnt, nFlags);
}
命令的有效性处理,程序共有4个命令即”设置“、”打开串口“、”关闭串口“、”退出“、命令。这4个命令操作是互相关联的。为避免无效的操作,要对命令进行有效性处理。以下是代码:
void CTTYSendApiView::OnUpdateSetupcom(CCmdUI* pCmdUI) //“设置”命令
{
// TODO: Add your command update UI handler code here
//根据串口是否打开,决定是否允许使用“设置”命令
if(!blnOpened)
{
pCmdUI->Enable(true); //
}
else
{
pCmdUI->Enable(false); //
}
}
void CTTYSendApiView::OnUpdateOpencom(CCmdUI* pCmdUI) //“打开串口”命令
{
// TODO: Add your command update UI handler code here
//根据串口是否打开,决定是否允许使用“打开串口”命令
if(!blnOpened)
{
pCmdUI->Enable(true); //
}
else
{
pCmdUI->Enable(false); //
}
}
void CTTYSendApiView::OnUpdateClosecom(CCmdUI* pCmdUI) //“关闭串口”命令
{
// TODO: Add your command update UI handler code here
//根据串口是否打开,决定是否允许使用“关闭串口”命令
if(blnOpened)
{
pCmdUI->Enable(true);
}
else
{
pCmdUI->Enable(false);
}
}
void CTTYSendApiView::OnUpdateAppExit(CCmdUI* pCmdUI) //“退出”命令
{
// TODO: Add your command update UI handler code here
//根据串口是否打开,决定是否允许使用“退出”命令
if(blnOpened)
{
pCmdUI->Enable(false);
}
else
{
pCmdUI->Enable(true);
}
}
在析构函数中对串口号进行初始化, myCom="COM4";/串口号
blnOpened=false;//关闭串口状态
至此,基本上应该能够实现通信了。