手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

在VC 6.0中用Win32API实现串行通信

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!


  事件监视线程对串口事件进行监视,当监视的事件发生时,监视线程可将这个事件发送(SendMessage)或登记(PostMessage)到对事件进行处理的窗口类(由pParam指定)中。

UINT CommWatchProc(LPVOID pParam)
{
 DWORD dwEventMask=0; //发生的事件;
 while(bOpen)
 {
  //等待监视的事件发生
  WaitCommEvent(hComDev, &dwEventMask,NULL);
  if ((dwEventMask & EVRXCHAR)==EVRXCHAR)
   ……//接收到字符事件后,可以将此消息登记到由pParam有指定的窗口类中进行处理
  if(dwEventMask & EVERR)==EVERROR)
   ……//发生错误时的处理
 }
 SetEvent(hEvent);
 //发信号,指示监视线程结束
 return 0;
}
  关闭串行设备

  在整个应用程序结束或不再使用串行设备时,应将串行设备关闭,包括取消事件监视,将设备打开标志bOpen置为FALSE以使事件监视线程结束,清除发送/接收缓冲区和关闭设备句柄。

void CloseSynComm()
{
 if(!bOpen) return;
 //结束事件监视线程
 bOpen=FALSE;
 SetCommMask(hComDev,0);
 //取消事件监视,此时监视线程中的WaitCommEvent将返回
 WaitForSingleObject(hEvent,INFINITE);
 //等待监视线程结束
 CloseHandle(hEvent); //关闭事件句柄
 //停止发送和接收数据,并清除发送和接收缓冲区
 PurgeComm(hComDev,PURGETXABORT| PURGERXABORT|PURGETXCLEAR|PURGERXCLEAR);
 //关闭设备句柄
 CloseHandle(hComDev);
}
  二、编程步骤

  1、 启动Visual C 6.0,生成一个基于对话框的的应用程序,将该程序命名为“SerealCom”;

  2、 按照图一的界面设计对话框,具体设置参见代码部分;

  3、 使用Class Wizard为对话框的按钮添加鼠标单击消息响应函数;

  4、 添加代码,编译运行程序。
  三、程序代码

//////////////////////////////////////////////////////////////

#if !defined(_COMM_ACCESS_FUNCTIONS_AND_DATA)
#define _COMM_ACCESS_FUNCTIONS_AND_DATA
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define EVENTCHAR 0x0d
#define MAXBLOCKLENGTH 59

extern BYTE XwCom;
extern BYTE sCom1[5],sCom2[MAXBLOCKLENGTH 12];
extern sCom3[MAXBLOCKLENGTH 12];
extern BYTE opation;
extern short ComNum;

#define FC_DTRDSR 0x01
#define FC_RTSCTS 0x02
#define FC_XONXOFF 0x04
#define ASCII_BEL 0x07
#define ASCII_BS 0x08
#define ASCII_LF 0x0A
#define ASCII_CR 0x0D
#define ASCII_XON 0x11
#define ASCII_XOFF 0x13

class CComStatus
{
 public:
  HANDLE m_hCom;
  BYTE m_bComId;
  BYTE m_bByteSize;
  BYTE m_bStopBits;
  BYTE m_bParity;
  DWORD m_dwBaudRate;

  //WORD m_fChEvt;

  char m_bEvtChar;
  DWORD m_fBinary;
  BOOL m_bConnected;
  BOOL m_fXonXoff;
  BOOL m_bFlowCtrl;
  OVERLAPPED m_rdos;
  OVERLAPPED m_wtos;

  //functions

  CComStatus();
  CComStatus(BYTE bComId,BYTE bByteSize,BYTE bStopBits,BYTE bParity,
    DWORD dwBaudRate,/*WORD fChEvt,*/char bEvtChar,DWORD fBinary);
  BOOL OpenConnection();
  BOOL CloseConnection();
  BOOL SetupConnection();
  BOOL IsConnected();
};

UINT CommWatchProc( LPVOID lpData );
BOOL WriteCommBlock( CComStatus& comDev, LPSTR lpByte , DWORD dwBytesToWrite);
int ReadCommBlock(CComStatus& comDev,LPSTR lpszBlock, int nMaxLength );
int ReadCommBlockEx(CComStatus& comDev,LPSTR lpszBlock, int nMaxLength,DWORD dwTimeOut);
#endif

///////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "com232.h"

BYTE XwCom=0x40;
BYTE sCom1[5],sCom2[MAXBLOCKLENGTH 12],sCom3[MAXBLOCKLENGTH 12];
BYTE opation;
short ComNum;
CComStatus::CComStatus()
{
 m_hCom = NULL;
 m_bComId = (char)ComNum;//COM1
 m_bByteSize=8;
 m_bStopBits=ONESTOPBIT;
 m_bParity=NOPARITY;
 m_dwBaudRate=9600;
 m_bEvtChar=EVENTCHAR;
 m_fBinary=1;
 m_bConnected = FALSE;
 m_bFlowCtrl = FC_XONXOFF ;
 m_fXonXoff = FALSE;
}

CComStatus::CComStatus(BYTE bComId,BYTE bByteSize,BYTE bStopBits,BYTE bParity,DWORD dwBaudRate,/*WORD fChEvt,*/char bEvtChar,DWORD fBinary)
{
 m_hCom = NULL;
 m_bComId = bComId;
 m_bByteSize=bByteSize;
 m_bStopBits=bStopBits;
 m_bParity=bParity;
 m_dwBaudRate=dwBaudRate;
 m_bEvtChar=bEvtChar;
 m_fBinary=fBinary;
 m_bConnected = FALSE;
 m_bFlowCtrl = FC_XONXOFF ;
 m_fXonXoff = FALSE;
}

BOOL CComStatus::OpenConnection()
{
 char csCom[10];
 COMMTIMEOUTS CommTimeOuts ;
 if((m_bComId < 0) || (m_bComId > 4))
  return FALSE;//从COM1到COM4
 if(m_hCom)//if already open
 return FALSE;

 //OVERLAPPED包含异步I/O信息

 m_rdos.Offset = 0;
 m_rdos.OffsetHigh = 0;
 m_rdos.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS