正文内容
vc的学习方法
来源:漫步者
作者:开心麻花
2025-09-19
1

vc的学习方法(精选6篇)

vc的学习方法 第1篇

关于VC++的学习问题的补充!

杨老师,我现在正在学VC++,老师能给我说一下用人单位对VC++程序员的要求吗?也就是说他们如果来招

VC++程序员,他们会提些什么问题,会对哪方面要求高呢。!如果我有好多API函数不会他们会介意吗?(API函数太多了。真不知道该怎么学了!)我已经看过侯捷老师的《深入浅出MFC》,虽说目前还没看完,但我对MFC的消息机制,MFC里面定义的一些宏,以及整个windows窗口程序的创建过程,MFC程序的执行流 程都有了了解,这些东西能满足用人单位对VC++程序员对MFC的基础的要求吗?如果不能我还应该学些什么呢?对于VC++

更深入的学习,我该学习那些方面的东西呢?老师帮忙解答下行吗?谢谢老师了!

在这里我再向老师说一下我目前到毕业前的学习计划,老师帮忙指点一下:

* 1 目前学好VC++,应该学习的书籍《深入浅出MFC》,《VC++技术内幕》,《VC++深入详解》等

* 2 VC++学到一定程度后再加强一下C++知识,重读《C++ Primer》,《The C++ Programing Language》,再读《Effective C++》《More Effective C++》《Thinking in C++》

* 3 加强一下数据结构和算法的学习,学习相关书籍 《数据结构》(严蔚敏)《数据结构与算法分析》

(C++描述)《算法导论》

这就是我目前到毕业前的学习计划,老师帮忙看一下,看我的计划相对现在的就业形势和就业要求是否合理啊,如果有不合理的地方,请老师帮忙指点一下,谢谢老师,如果老师认为还有哪些书或是哪些功课我应该学习一下,请老师帮忙推荐或指点一下。学生再此谢谢老师了!谢谢!

首先,我在别的文章里讲过,应届生招聘和社会招聘是有本质不同的,看一看这几篇文章:

首先你不要把自己定位为“VC开发MFC的程序员”,那样你的路会很窄,虽然我建议你大学期间把MFC弄痛弄透就好了,但是要意识到一下的事实,只要你真的把MFC弄透了,那么也许你毕业后从事的工业不是MFC框架,而是别的其他的框架,比如其他开源的框架或者公司自己的框架;甚至不是VC开发,而是Linux下的C/C++的开发;甚至有可能你毕业以后做的都不是C/C++的开发,而是其他语言的开发。你可能看过我的这段文字,我贴过来:

我上大学的时候一直在钻研是Delphi语言,可是毕业校园招聘的时候我照样在Java职位的考试取得了第一名,而且工作以后经过简单的学习就掌握了Java语言,并且后来还写了三本关于Java语言的书;再如我毕业后两年多的时间一直在用Java开发,后来公司要做一套基于.NET的产品,我只用了一个礼拜熟悉了.NET体系以及C#的语法,然后就开始进行开发。

我大学时有一个同学,他看我当时Delphi学的比较好,写了很多程序,他就说他也想学软件开发,让我教他Delphi,可是我们专业前一个学期已经开了PowerBuilder的课,因此当时我就建议他还是继续深入学习PowerBuilder,用PowerBuilder写又实用价值的东西,而不是像上课那样写HelloWorld的程序。当时Delphi还是如日中天的流行的编程语言,而PowerBuilder则市

场占有率比较小,他就说不想继续学PowerBuilder,因为PowerBuilder没前途,我就给他讲了“一通百通,从自己最熟悉的入手”这个道理,然后他就踏实的深入研究PowerBuilder起来,到了毕业的时候他已经能用PowerBuilder写非常复杂的程序而且还学习了用PowerBuilder写Web程序。毕业后没多久就应公司的要求用Delphi写程序,他只用了不到一周的时间学习了Delphi,然后就写出了一个符合公司要求的系统,当时他就给我打电话向我报喜。前一阵子我听说他已经开始指导一些新员工用Java开发一个中型规模的企业级系统了。可以说他的成功就得益于“一通百通,从自己最熟悉的入手”这个原则。

所以好一点的企业,可能并不会在乎你会什么技术、什么工具,而是看重你的动手能力和自学能力,说实话现在招MFC的程序员不是很多,但是还是建议你继续在MFC上深入下去,因为只有通过你已经在研究的这个技术深入下去,你才能达到“一通百通”的“以不变应万变”的层次。

1、“API函数太多了。真不知道该怎么学了!”,API不是靠背的,是靠一遍一遍的用,写一个一个的程序过程中“人剑合一”的,多写程序、多出作品,自然就记住了。而且不是所有函数都需要记,常用的“人剑合一”,不常用的知道有那么回事,用的时候再查。

2、“目前学好VC++,应该学习的书籍《深入浅出MFC》,《VC++技术内幕》,《VC++深入详解》等

”,没必要看那么多书,学编程应该靠多写代码,而不是看书,看《深入浅出MFC》这本书就行了,争取自己写一个模仿MFC的框架出来。这样你就不一样了。

3、“ VC++学到一定程度后再加强一下C++知识,重读《C++ Primer》,《The C++ Programing Language》 再读《Effective C++》《More Effective C++》《Thinking in C++》”。再次重复“学编程应该靠多写代码,而不是看书”,这些书都大同小异,你难道要把世界上所有的C++的书都看一遍才安心吗?现在的学生都有一个通病,就是认为把所有的书看完一遍才安心。这些书弄一本当作手边的参考教材就行,你如果能达到“写一个模仿MFC的框架出来”的层次,这些书你都看不到眼里了。举个例子,当时我学Java的时候,看书店里那么多书,心想“什么时候才能看完呀”,等我玩了一年Java,然后自己写了一些模仿的框架以后,回头再去书店看那些书,没有几本我看得上眼的,现在挑上一本我看得上眼的好书都是我的奢求了。所谓把书读薄了就是这个道理。

4、“加强一下数据结构和算法的学习”数据结构肯定要好好学的,但是同样是要看书与实践多结合,把书中的伪代码自己亲自写出来。

祝你成功!加油!

vc的学习方法 第2篇

中国人自古就有自右至左、从上到下书写汉字的习惯。而当我们在自己所编写的应用程序中使用输出函数输出的总是自左至右的横排文字。有没有可能在我们的应用程序中实现竖写汉字的效果呢?笔者偶然发现了一种利用VC实现竖写汉字效果的方法,现在就把它介绍给大家。

Windows系统内置了许多名称以“@”开头的字集,这些字集有一个共同的特点,即其所包含的文字全都是平躺着的(字头朝左,字底朝右)。如果我们能将这些字逆时针旋转270度后再显示出来,就可以达到实现竖写汉字效果的目的了。

要使文字发生旋转,我们只需创建一个逻辑字体并设定该逻辑字体的显示角度,再设定其字体名称为一个以“@”开头的字集的名称即可。我们可以采用两种方式创建逻辑字体。

其一,用CFont类的成员函数CreateFont直接创建逻辑字体。CreateFont的参数定义如下:

BOOLCreateFont(

intnHeight,//字体的高度

intnWidth,//字体的宽度

intnEscapement,//字体显示的角度

intnOrientation,//字体的角度

intnWeight,//字体的磅数

BYTEbItalic,//斜体字体

BYTEbUnderline,//带下划线的字体

BYTEcStrikeOut,//带删除线的字体

BYTEnCharSet,//所需的字符集

BYTEnOutPrecision,//输出的精度

BYTEnClipPrecision,//裁减的精度

BYTEnQuality,//逻辑字体与输出设备的实际

//字体之间的精度

BYTEnPitchAndFamily,//字体间距和字体集

LPCTSTRlpszFacename//字体名称

);

其中nEscapement单位为0.1角度,方向为逆时针,所以为了使平躺的字立起来应设定其值为2700,lpszFacename则赋以“@”开头的字集的名称,如“@system”。

其二,利用LOGFONT结构,将该结构作为参数调用CFont类的成员函数CreateFontIndirect创建逻辑字体。LOGFONT结构通常被用来描述一种逻辑字体,结构内的各变量分别代表逻辑字体的各个属性,这些变量与函数CreateFont的参数相同。其结构如下:

typedefstructtagLOGFONT{//lf

LONGlfHeight;//字体的高度

LONGlfWidth;//字体的宽度

LONGlfEscapement;//字体显示的角度

LONGlfOrientation;//字体的角度

LONGlfWeight;//字体的磅数

BYTElfItalic;//斜体字体

BYTElfUnderline;//带下划线的字体

BYTElfStrikeOut;//带删除线的字体

BYTElfCharSet;//所需的字符集

BYTElfOutPrecision;//输出的精度

BYTElfClipPrecision;//裁减的精度

BYTElfQuality;//逻辑字体与输出设备的

//实际字体之间的精度

BYTElfPitchAndFamily;//字体间距和字体集

TCHARlfFaceName[LF_FACESIZE];//字体名称

}LOGFONT;

下面我们就以一个示例来说明竖写汉字的实现方法:

1.建立一个MFCAppWizard(exe)应用工程CHNfont。在MFCAppWizard向导的第一步中选择SingleDocument,再点击按键Finish->OK完成工程的建立。

2.在CMainFrame.:OnCreate函数中添加如下代码,使窗体最大化。AfxGetMainWnd->ShowWindow(SW_SHOWMAXIMIZED);

3.添加如下代码实现竖写功能。

voidCChildView::OnPaint()

{

CPaintDCdc(this);//devicecontextforpainting

///////利用CFont::CreateFont(...)函数实现竖写汉字////////

CFontmyFont;//创建字体对象

//创建逻辑字体

myFont.CreateFont(

56,//字体高度(旋转后的字体宽度)=56

20,//字体宽度(旋转后的字体高度)=20

2700,//字体显示角度=270°

0,//nOrientation=0

10,//字体磅数=10

FALSE,//非斜体

FALSE,//无下划线

FALSE,//无删除线

DEFAULT_CHARSET,//使用缺省字符集

OUT_DEFAULT_PRECIS,//缺省输出精度

CLIP_DEFAULT_PRECIS,//缺省裁减精度

DEFAULT_QUALITY,//nQuality=缺省值

DEFAULT_PITCH,//nPitchAndFamily=缺省值

“@system”);//字体名=@system

CFont*pOldFont=dc.SelectObject(&myFont);//选入设备描述表

CRectrtClient;

GetClientRect(rtClient);//获取客户区尺寸、位置信息

//在客户区适当位置输出文字

dc.TextOut(rtClient.Width()/2+30,rtClient.Height()/8,

“无边落木萧萧下”);

dc.SelectObject(pOldFont);//将myFont从设备环境中分离

myFont.DeleteObject();//删除myFont对象

///////////利用LOGFONT结构实现竖写汉字//////////////

LOGFONTlf;//定义字体结构

lf.lfWeight=10;//字体磅数=10

lf.lfHeight=56;//字体高度(旋转后的字体宽度)=56

lf.lfWidth=20;//字体宽度(旋转后的字体高度)=20

lf.lfUnderline=FALSE;//无下划线

lf.lfStrikeOut=FALSE;//无删除线

lf.lfItalic=FALSE;//非斜体

lf.lfEscapement=2700;//字体显示角度=270°

lf.lfCharSet=DEFAULT_CHARSET;//使用缺省字符集

strcpy(lf.lfFaceName,“@system”);//字体名=@system

CFontmyLogFont;//定义字体对象

myLogFont.CreateFontIndirect(&lf);//创建逻辑字体

pOldFont=dc.SelectObject(&myLogFont);//选入设备描述表

//在客户区适当位置输出文字

dc.TextOut(rtClient.Width()/2-30,rtClient.Height()/8,

“不尽长江滚滚来”);

dc.SelectObject(pOldFont);//将myFont从设备环境中分离

myLogFont.DeleteObject();//删除myLogFont对象

}

4.编译连接,运行,

以上实例在Windows98下,以VC++6.0编译通过。

一个用VC++开发的学习游戏 第3篇

1) 游戏设计为在局域网中的两台计算机上进行单项选择题的答题比赛, 为了使游戏生动有趣, 界面中应具有动画元素, 采用昆虫从左至右爬行时到达的位置, 指示双方的积分状况。

2) 游戏双方各设置50道单项选择题, 可以在游戏的任何一方看到另一方的积分, 积分规则为答对一题加10分, 积分首先达到500分的一方胜出。

3) 游戏采用VC++, Window7/Visual Studio 2008平台开发, 利用套接字 (Socket) 技术实现局域网中的信息传递。

2 模块设计

本游戏共由三个模块组成, 它们分别是:1) 管理模块。2) 界面模块。3) 通信模块。下面分别对这三个模块的设计要点进行说明:

2.1 管理模块

在工程中, 我们设计了一个CManage类, 该类为C++类 (普通类) :

其中, Get Ji Fen方法的代码如下:

在对话框类中定义CManage对象 (以服务器端为例) :

试题和正确答案分别放在文本文件Exam Paper.txt和Answer.txt中, 通过Get Shi Ti方法读取试题内容, 在编辑控件中显示, 通过Get Zq Daan方法读取正确答案, 存放在zqda[50]中, 通过对话框类的Jifen Cnt Send方法从网格控件中读取玩家选择的答案, 存放在da[50]中。

2.2 界面模块

2.2.1 服务器端界面

创建一个基于对话框的工程, 并在对话框上添加控件, 如图1及表1所示:

2.2.2 客户端界面

创建一个基于对话框的工程, 并在对话框上添加控件, 如图2及表2所示:

2.2.3 动画效果

我们利用计时器函数和Bit Blt () 函数在对话框上显示动画, 通过位图的交替显示实现昆虫爬行的两个分解动作, 从而实现昆虫爬行的动画效果。首先需要在工程中导入下列位图:

在工程中添加计时器函数, 计时器函数代码:

其中, Drawinsect函数的代码:

MERGEPAINT是把图形反色后再同贴图目的地进行OR运算, 而SRCAND是把图形和贴图目的地进行AND运算。黑色的RGB值为 (0, 0, 0) , 白色的RGB值为 (255, 255, 255) , 任何颜色同白色进行OR运算的结果都为白色, 任何颜色同黑色进行OR运算的结果都为该颜色本身, 所以先将bmpkc2.bmp或bmpkc4.bmp反色, 则其前景变成了白色, 背景变成了黑色, 同目的地进行OR运算后, 昆虫处为白色, 背景处为目的地原来的颜色, 如图4所示。然后将bmpkc1.bmp或bmpkc3.bmp贴在相同的位置, 贴图的白色背景同目的地颜色进行AND运算, 结果还是目的地的颜色, 但同目的地的白色进行AND运算的结果为昆虫的颜色, 这样就很好地达到了去除背景色的效果, 如图5所示。

2.3 通信模块

我们分别在服务器端和客户端添加基于CSocket类的CServer Socket类和CClient Socket类, 用于发送和接收信息。

如图6所示, 服务器端由On Listen方法创建套接字后开始监听, 客户端由On Lj Server方法向服务器端发出连接请求, 当服务器端收到连接请求时, CServer Socket类中的On Accept () 方法调用CTazhi Server Dlg类中的Accept Connect () 方法, 获取套接字指针, 并向客户端发送“连接成功”信息。双方的Receive Data方法负责信息的接收, 当收到对方发来的信息时, 套接字中的On Receive () 方法会调用对话框类中的Receive Data () 方法, 接收并处理对方发来的信息。以客户端为例, Receive Data () 函数的代码:

我们在对话框类中添加了Jifen Cnt Send函数, 用于读取网格控件中的答案, 判断输赢, 显示自己的积分和向对方发送积分, Jifen Cnt Send函数的代码:

3 结束语

生成可执行文件之后, 在一台计算机上启动服务器端程序Tazhi Server.exe, 然后在另一台计算机上启动客户端程序Tazhi Client.exe, 在服务器端单击“监听”按钮, 在客户端输入服务器端的计算机名称, 然后单击“连接”按钮, 如果连接成功, 会显示“连接成功!”对话框, 单击“确定”按钮, 然后单击“抽题”按钮, 抽取试题, 开始答题。积分首先超过500分的一方胜出。

参考文献

[1]明日科技.Visual C++项目开发实例自学手册[M].北京:人民邮电出版社, 2008.

[2]雷超然, 罗勋阳, 吴裕豪, 等.Visual C++MFC棋牌类游戏编程实例[M].北京:人民邮电出版社, 2008.

vc的学习方法 第4篇

关键词:VC++;串口通信;设计方案

To Achieve Design Method of Serial Communication on VC+ +

Xiao Zhihao

(No.715 Institute,Fuyang311400,China)

Abstract: With the computer technology and control technology and the rapid development of increasingly mature,play all kinds of communication between the role of functional modules based on VC + + computer programming serial communications in today's computer software is widely used.In this paper,fully mechanized work system for example,an overview of VC + + based on the host computer and lower computer serial communication between the design method.

Keywords:VC + +;Serial communication;Design

综采工作面电控系统是综合机械化采煤装备,它利用液压支架和采煤机、输送机等多机联动,具有高产、高校、安全、自动化等优点。

一、综述

综采工作面液压支架电控系统硬件如图一所示。下位机的功能是完成液压支架的控制,上位机的功能是完成子控机的监测控制。基于VC++的综采工作面液压直接电控系统实现上位机和下位机之间的串口通信,实现人机界面的动态显示,数据库读写等功能。

图一

二、串行函数接口程序设计

在此系统中,上位机和下位机之间的串口通信可以采用方法很多,例如VB、Matlab、组态王、VC++等等,但是在这几种软件中,VB的编程工具不够完全,效率低;组态王命令语言环境弱,传输大量数据时局限性很大,难以实现复杂的数据处理;Matlab的界面开发能力不强,代码运行效率低。因此,效率高、封装性好、继承性高的VC++软件成为开发本系统的首选串口编程软件。

(一)上位机通信设计。首先要对串口进行初始化,确定其工作方式、波特率等,系统定为:1个停止位、波特率9600,数据格式为8个数据位等。具体实现:

1.设置对话框初始化CAN参数:为对话框建立基于CDialog的派生类CC ansettingDlg,并利用Class-Wizard”菜单项以及Member Variables为参数控件设置关联变量。同时,添加按钮并添加响应函数,点击链接时,各项的初始化参数都自动存储,并且与CAN总线连接,一旦点击启动按钮,就能够存储总线信号。

2.基于VC++采用MFC编写接口函数,过程如下:(1)打开设备并初始化CAN:CCansettingDlg::CCansettingDlg(CWnd* pParent /* = NULL……:CDialog(CCansettingDlg::IDD,pParent);(2)获取CAN 状态:typedef struct _VCI_CAN_STATUS;(3)连接CAN:void CCansettingDlg::OnButtonConnect() / /为连接按钮添加;(4)启动CAN:void CCansettingDlg::OnButtonStartcan();(5)从指定的设备接收数据并放入数据库。

3.创建线程,从CAN总线读取的数据存入数据库:static UINT ReceiveThread( void * param);//创建线程,添加响应函数,设置变量,总线上有数据,就能够触发线程,把数据存入数据库,其函数为:

(二)下位机通信设计。下位机采用的是MCS—51系列中的8051单机。下位机的串行通信设计时采用中断收发数据的,其流程如下图。发送数据时,从累加器中向串口缓冲寄存器中传送数据;接受数据时,从串口缓冲寄存器向累加器传送数据。实际应用中,单片机接受PC机发出的地址信号之后,转入相应的中断程序服务子程序,与PC机通信。

下位机流程图

三、程序串口测试

通过简单串口调试工具,进行程序测试,如下图:

测试显示

如果串口正常运行, 那么可以自由接收和发送数据。

总结:综合上述例子,VC++相对与其他编程软件来说,是一个非常优秀的系统开发平台,编程简化、程序透明化、适应性好、可移植性高。利用VC++运行库的通信函数实现串口通信的原理简单,但是依旧有着不足之处,其实用性和灵活性较差,因此,在具体实践时,要结合软件的功能模块需求,综合考虑其复杂程度、灵活性等环境因素,选择适当的方式,来实现上位机与下位机之间的串口通信。

参考文献:

[1]赵晓辉,陈艳萍,张科英,张东红.基于VC++环境下串口通信程序的研究与实现[J].科技信息,2010,1

[2]王娇,姚竹亭.基于VC++6.0的串口通信的设计[J].测试工具及解决方案,2009,11

[3]白宁,金华晋.基于VC++6.0的串口通信程序开发[J].电脑编程技巧与维护,2010,12

vc的学习方法 第5篇

1、启动VS2008(我的默认环境是VC),单击“File”->“New”->“Project”

出现如下对话框:

接下来按照图示来,我就不文字叙述了,

2、点击“Finish”后,在右击“Source Files”->“Add”->“New Item”:

出现如下对话框:

如果是C程序,就添加后缀“.c”,单击“Add”就可以写程序代码了(对于头文件和资源文件的添加是一样的,这里就不多说了),

3、我用的测试代码如下:

4、单击“Debug”->“Start Without Debugging”:

出现如下对话框:

单击“Yes”,运行结果为:

vc的学习方法 第6篇

湖南大学(长沙410082) 于小亿 王 辉 张志学

摘 要 详细介绍了在Windows环境下应用VC++实现PC机与单片机的几种串行通信方法,给出了用Visual C++6.0编写的PC机程序和用C51编写的单片机通信程序。经实际应用系统运行稳定可靠。

关键词 Visual C++ 类 串行通信

工业控制领域(如DCS系统),经常涉及到串行通信问题。为了实现微机和单片机之间的数据交换,人们用各种不同方法实现串行通信,如DOS下采用汇编语言或C语言,但在Windows 环境下却存在一些困难和不足。在Windows操作系统已经占据统治地位的情况下(何况有些系统根本不支持DOS如Windows2000)开发Windows 环境下串行通信技术就显得日益重要。

VC++6.0是微软公司于1998年推出的一种开发环境,以其强大的功能,友好的界面,32位面向对象的程序设计及Active X的灵活性而受广大软件开发者的青睐,被广泛应用于各个领域。应用VC++开发串行通信目前通常有如下几种方法:一是利用Windows API通信函数;二是利用VC的标准通信函数_inp、_inpw、_inpd、_outp、_outpw、_outpd等直接对串口进行操作;三是使用Microsoft Visual C++的通信控件(MSComm);四是利用第三方编写的通信类。以上几种方法中第一种使用面较广,但由于比较复杂,专业化程度较高,使用较困难;第二种需要了解硬件电路结构原理;第三种方法看来较简单,只需要对串口进行简单配置,但是由于使用令人费解的VARIANT类,使用也不是很容易;第四种方法是利用一种用于串行通信的CSerial类(这种类是由第三方提供),只要理解这种类的几个成员函数,就能方便的使用。笔者利用CSerial类很方便地实现了在固定式EBM气溶胶灭火系统分区启动器(单片机系统)与上位机的通信。以下将结合实例,给出实现串行通信的几种方法。

1 Windows API通信函数方法

与通信有关的Windows API函数共有26个,但主要有关的有:

CreateFile() 用 “comn”(n为串口号)作为文件名就可以打开串口。

ReadFile() 读串口。

WriteFile() 写串口。

CloseHandle() 关闭串口句柄。初始化时应注意CreateFile()函数中串口共享方式应设为0,串口为不可共享设备,其它与一般文件读写类似。以下给出API实现的源代码。

1.1 发送的例程

//声明全局变量

HANDLE m_hIDComDev;

OVERLAPPED m_OverlappedRead, m_Over lappedWrite;

//初始化串口

void CSerialAPIView::OnInitialUpdate()

{

CView::OnInitialUpdate();

Char szComParams[50];

DCB dcb;

Memset(&m_OverlappedRead, 0, sizeof (OVERLAPPED));

Memset(&m_OverlappedWrite, 0, sizeof (OVERLAPPED));

m_hIDComDev = NULL;

m_hIDComDev = CreateFile(“COM2”, GENERIC_READ│GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL│FILE_FLAG_OVERLAPPED, NULL);

if (m_hIDComDev == NULL)

{

AfxMessageBox(“Can not open serial port!”);

goto endd;

}

memset(&m_OverlappedRead, 0, sizeof (OVERLAPPED));

memset(&m_OverlappedWrite, 0, sizeof (OVERLAPPED));

COMMTIMEOUTS CommTimeOuts;

CommTimeOuts. ReadIntervalTimeout=0FFFFFFFF;

CommTimeOuts. ReadTotalTimeoutMultiplier = 0;

CommTimeOuts. ReadTotalTimeoutConstant= 0;

CommTimeOuts. WriteTotalTimeoutMultiplier = 0;

CommTimeOuts. WriteTotalTimeoutConstant = 5000;

SetCommTimeouts(m_hIDComDev, &CommTimeOuts);

Wsprintf(szComparams, “COM2:9600, n, 8, 1”);

m_OverlappedRead. hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

m_OverlappedWrite. hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

dcb. DCBlength = sizeof(DCB);

GetCommState(m_hIDComDev, &dcb);

dcb. BaudRate = 9600;

dcb. ByteSize= 8;

unsigned char ucSet;

ucSet = (unsigned char) ((FC_RTSCTS&FC_DTRDSR) != 0);

ucSet = (unsigned char) ((FC_RTSCTS&FC_RTSCTS) ! = 0);

ucSet = (unsigned char) ((FC_RTSCTS&FC_XONXOFF) ! = 0);

if (!SetCommState(m_hIDComDev, &dcb)‖

!SetupComm(m_hIDComDev,10000,10000)‖

m_OverlappedRead. hEvent ==NULL‖

m_OverlappedWrite. hEvent ==NULL)

{

DWORD dwError = GetLastError();

if (m_OverlappedRead. hEvent != NULL) CloseHandle(m_OverlappedRead. hEvent);

if (m_OverlappedWrite. hEvent != NULL) CloseHandle(m_OverlappedWrite. hEvent);

CloseHandle(m_hIDComDev);

}

endd:

;

}

//发送数据

void CSerialAPIView::OnSend()

{

char szMessage[20] = “thank you very much”;

DWORD dwBytesWritten;

for (int i=0; i

{

WriteFile(m_hIDComDev, (LPSTR)&szMessage[i], 1, &dwBytesWritten, &m_OverlappedWrite);

if (WaitForSingleObject(m_OverlapperWrite, hEvent, 1000))dwBytesWritten = 0;

else{

GentOverlappedResult(m_hIDComDev, &m_OverlappedWrite, &dwBytesWritten, FALSE);

m_OverlappedWrite. Offset += dwBytesWritten;

}

dwBytesWritten++;

}

}

1.2 接收例程

DCB ComDcb; //设备控制块

HANDLE hCom; //global handle

hCom = CreateFile (“COM1”,GENERIC_READ| GENERIC_WRITE,0,

NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

if (hCom==INVALID_HANDLE_VALUE)

{

AfxMessageBox(“无法打开串行口”);

}

else

{

COMMTIMEOUTS CommTimeOuts ;

SetCommMask(hCom, EV_RXCHAR ) ;

SetupComm(hCom, 4096, 4096 ) ; /*设置收发缓冲区 尺寸为4K */

PurgeComm(hCom, PURGE_TXABORT| PURGE_RXABORT |

PURGE_TXCLEAR| PURGE_RXCLEAR ) ; //清收发缓冲区

//以下初始化结构变量CommTimeOuts, 设置超时参数 CommTimeOuts.ReadIntervalTimeout = 0FFFFFFFF ;

CommTimeOuts.ReadTotalTimeoutMultiplier = 0 ;

CommTimeOuts.ReadTotalTimeoutConstant = 4000 ;

CommTimeOuts.WriteTotalTimeoutMultiplier = 0;

CommTimeOuts.WriteTotalTimeoutConstant = 4000 ;

SetCommTimeouts(hCom, &CommTimeOuts ); //设置超时参数

ComDcb.DCBlength = sizeof( DCB ) ;

GetCommState( hCom, &ComDcb ) ; //获取当前参数

ComDcb.BaudRate =9600; //波特率

ComDcb.ByteSize = 8; //数据位

ComDcb.Parity = 0; /*校验 0~4=no, odd, even, mark, space */

SetCommState(hCom, &ComDcb ) ;

} //设置新的通信参数

接收可用定时器或线程等

DWORD dRead,dReadNum;

unsigned char buff [200];

dRead=ReadFile(hCom, buff, 100, &dReadNum, NULL); //接收100个字符,

//dReadNum为实际接收字节数

2 利用端口函数直接操作

这种方式主要是采用两个端口函数_inp(), _outp()实现对串口的读写,其中读端口函数的原型为:

int _inp(unsigned shot port)

该函数从端口读取一个字节,端口号为0~65535。

写端口的函数原型为:

int _outp(unsigned shot port, int databyte)

该函数向指定端口写入一个字节。

不同的计算机串口地址可能不一样,通过向串口的控制及收发寄存器进行读写,可以实现灵活的串口通信功能,由于涉及具体的硬件电路讨论比较复杂,在此不加赘述,

3 MSComm控件

MSComm控件是微软开发的专用通信控件,封装了串口的所有功能,使用很方便,但在实际应用中要小心对其属性进行配置。下面详细说明该类应用方法。

3.1 MSComm控件的属性

CommPort:设置串口号,类型 short :1-comm1 2-comm2.

Settings:设置串口通信参数,类型 CString :B波特率,P奇偶性(N无校验,E偶校验,O奇校验),D字节有效位数,S停止位。

PortOpen:设置或返回串口状态,类型 BOOL:TURE打开,FALSE关闭。

InputMode:设置从接收缓冲区读取数据的格式,类型 long: 0-Text 1-Bin。

Input:从接收缓冲区读取数据,类型 VARIANT。

InBufferCount:接收缓冲区中的字节数,类型:short。

InBufferSize:接收缓冲区的大小,类型:short。

Output:向发送缓冲区写入数据,类型:VARIANT。

OutBufferCount:发送缓冲区中的字节数,类型:short。

OutBufferSize:发送缓冲区的大小,类型:short。

InputLen:设置或返回Input读出的字节数,类型:short。

CommEvent:串口事件,类型:short。

3.2 程序示例

串口初始化

if (!m_comm.GetPortOpen())

m_comm.SetPortOpen(TURE); /*打开串口*/

m_comm.SetSettings(“4800,n,8,1”); /*串口参数设置*/

m_comm.SetInputMode(0); /*设置TEXT缓冲区输入方式*/

m_comm.SetRthresHold(1); /*每接收一个字符则激发OnComm()事件*/

接收数据

m_comm.SetInputLen(1); /*每次读取一个字符

VARINAT V1=m_comm.GetInput();

/*读入字符*/

m_V1=V1.bstrval;

发送字符 m_comm.SetOutput(Colevariant (“Hello”); /*发送 “Hello” */

3.3 注意

SetOutput方法可以传输文本数据或二进制数据。用SetOutput方法传输文本数据,必须定义一个包含一个字符串的 Variant。发送二进制数据,必须传递一个包含字节数组的Variant 到 Output 属性。正常情况下,如果发送一个 ANSI 字符串到应用程序,可以以文本数据的形式发送。如果发送包含嵌入控制字符、Null 字符等的数据,要以二进制形式发送。此处望引起读者注意,笔者曾经在此犯错。

4 VC++类CSerial

4.1 串行通信类CSerial简介

Cserial 是由MuMega Technologies公司提供的一个免费的VC++类,可方便地实现串行通信。以下为该类定义的说明部分。

class CSerial

{

public:

CSerial();

~CSerial();

BOOL Open( int nPort = 2, int nBaud = 9600 );

BOOL Close( void );

int ReadData( void *, int );

int SendData( const char *, int );

int ReadDataWaiting( void );

BOOL IsOpened( void ){ return( m_bOpened ); }

protected:

BOOL WriteCommByte( unsigned char );

HANDLE m_hIDComDev;

OVERLAPPED m_OverlappedRead, m_OverlappedWrite;

BOOL m_bOpened;

}

4.2 串行通信类Cserial 成员函数简介

1. CSerial::Cserial是类构造函数,不带参数,负责初始化所有类成员变量。

2. CSerial:: Open这个成员函数打开通信端口。带两个参数,第一个是埠号,有效值是1到4,第二个参数是波特率,返回一个布尔量。

3. CSerial:: Close函数关闭通信端口。类析构函数调用这个函数,所以可不用显式调用这个函数。

4. CSerial:: SendData函数把数据从一个缓冲区写到串行端口。它所带的第一个参数是缓冲区指针,其中包含要被发送的资料;这个函数返回已写到端口的实际字节数。

5. CSerial:: ReadDataWaiting函数返回等待在通信端口缓冲区中的数据,不带参数。

6. CSerial:: ReadData函数从端口接收缓冲区读入数据。第一个参数是void*缓冲区指针,资料将被放入该缓冲区;第二个参数是个整数值,给出缓冲区的大小。

4.3 应用VC类的一个实例

1. 固定式EBM气溶胶灭火系统简介

固定式EBM气溶胶灭火装置分区启动器是专为EBM灭火装置设计的自动控制设备。可与两线制感温、感烟探测器配套使用,当监测部位发生火情时,探测器发出电信号给分区启动器,经逻辑判断后发出声、光报警,延时后自动启动EBM灭火装置。为了便于火灾事故的事后分析,需对重要的火警事件和关键性操作进行记录,记录应能从PC机读出来;PC机能控制、协调整个系统的工作,这些都涉及通信。本例中启动器采用RS-485通信接口,系统为主从式网络,PC机为上位机。具体的通信协议为:(1)下位机定时向上传送记录的事件;(2)应答发送,即PC机要得到最新事件记录,而传送时间未到时,PC机发送命令,下位机接收命令后,把最新记录传给上位机;(3)上位机发送其它命令如校时、启动、停止、手/自动等。

2. 通信程序设计

部分上位机程序

(1)发送命令字程序,代码如下

voidCCommDlg::OnSend()

{

CSerial Serial;

//构造串口类,初始化串行口

if (Serial.Open(2,9600)) //if-1

//打开串行口2,波特率为9600bps

{

static char szMessage[]=“0”;

//命令码(可定义各种命令码)

int nBytesSent;

int count=0;

resend:

nBytesSent=Serial.SendData(szMessage,strlen(szMessage));

//发送命令码

char rdMessage [20];

if (Serial.ReadDataWaiting()) //if-2

{

Serial.ReadData(rdMessage,88);

//rdMessage 定义接收字节存储区,为全局变量//

if ((rdMessage[0]!=0x7f)&&(count<3))

{

count++;

goto resend

}

if(count>=3)

MessageBox(“发送命令字失败”);

}

else //if-2

MessageBox(“接收数据错误”);

}

else //if-1

MessageBox(“串行口打开失败”);

}

下位机通信程序:

#include

#include

#include

#define count 9

#define com_code 0x00

#define com_code1 0xff

unsigned char buffer[count];

int po,year,month,date,hour;

int minute,second,recordID ;

int sum;

main()

{

/*初始化串口和定时器*/

TMOD=020;

TH1=0fd;

TR1=001;

ET1=000;

ES=1;

EA=1;

/*待发送数据送缓冲区*/

buffer[0]=0ff; //数据特征码

buffer[1]=count+1; //数据长度

buffer[2]=year; //年

buffer[3]=month; //月

buffer[4]=date; //日

buffer[5]=hour; //时

buffer[6]=minute; //分

buffer[7]=second; //秒

buffer[8]=recordID; //事件号

for(po=0;po

sum+=buffer[po];

buffer[9]=sum; //校验和

}

/*发送中断服务程序*/

void send(void) interrupt 4 using 1

{

int i;

RI=0;

EA=0;

do

{

for(i=0;i<=count;i++)

{

SBUF=buffer[i]; //发送数据和校验和//

while(TI==0);

TI=0;

}

while(RI==0);

RI=0;

}while(SBUF!=0); //主机接收不正确,重新发送//

EA=1;

Return;

}

5 应用总结

根据不同需要,选择合适的方法。我们选用的用VC++类实现的上位机和下位机的串行通信方法具有使用简单、编写程序方便的特点。经过半年多应用于EBM灭火系统的情况来看,该方法实现的系统运行稳定可靠,是一种值得推广的简单易行的通信方法。

参 考 文 献

1 Kate Gregory Visual C++6开发使用手册.北京:机械工业出版社,1999

2 何立民.单片机的C语言应用程序设计.北京:北京航空航天大学出版社,1997

3 马风格.VC控件与串行通讯.1999现代计算机,2000(4)

相关文章
2024中考体育考试安全预案

2024中考体育考试安全预案

2024中考体育考试安全预案(精选13篇)2024中考体育考试安全预案 第1篇清涧分部2014年初中毕业学业理科实验操作、体育考试安全工作预案为...

1
2025-09-19
2024国培总结

2024国培总结

2024国培总结(精选9篇)2024国培总结 第1篇2017教师国培学习总结当今社会,教事业迅猛发展,各类培训数不胜数,而“国培”对于我们教育发...

1
2025-09-19
2024年单位与单位的新年联欢会主持稿及串词

2024年单位与单位的新年联欢会主持稿及串词

2024年单位与单位的新年联欢会主持稿及串词(精选5篇)2024年单位与单位的新年联欢会主持稿及串词 第1篇2018年单位与单位的新年联欢会主持...

1
2025-09-19
2024年上海市崇明县中考一模语文试题及答案

2024年上海市崇明县中考一模语文试题及答案

2024年上海市崇明县中考一模语文试题及答案(精选6篇)2024年上海市崇明县中考一模语文试题及答案 第1篇2017年崇明区初三一模语文试题(一...

1
2025-09-19
2010—2011学年度第一学期六年级语文教学计划

2010—2011学年度第一学期六年级语文教学计划

2010—2011学年度第一学期六年级语文教学计划(精选13篇)2010—2011学年度第一学期六年级语文教学计划 第1篇2010—2011学年下学期六年级...

1
2025-09-19
2011《农业农村工作知识》高频考点

2011《农业农村工作知识》高频考点

2011《农业农村工作知识》高频考点(精选12篇)2011《农业农村工作知识》高频考点 第1篇2011公考备考:《农业农村工作知识》高频考点2011-0...

1
2025-09-19
以案促改主持词

以案促改主持词

以案促改主持词(精选4篇)以案促改主持词 第1篇主持词同志们:根据市委要求,今天我们在这里召开“××局开展案件剖析做好以案促改工作动...

1
2025-09-19
2024致自己的励志说说

2024致自己的励志说说

2024致自己的励志说说(精选5篇)2024致自己的励志说说 第1篇人生,说到底,活的是心情。人活得累,是因为能左右你心情的东西太多。以下是...

1
2025-09-19
付费阅读
确认删除?
回到顶部