使用WinAPI写的小串口(不完善无法接收)

利用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;//关闭串口状态

至此,基本上应该能够实现通信了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值