VB mscomm 串口控件 及与51单片机通讯使用指南.docx

上传人:b****5 文档编号:8509151 上传时间:2023-01-31 格式:DOCX 页数:11 大小:22.92KB
下载 相关 举报
VB mscomm 串口控件 及与51单片机通讯使用指南.docx_第1页
第1页 / 共11页
VB mscomm 串口控件 及与51单片机通讯使用指南.docx_第2页
第2页 / 共11页
VB mscomm 串口控件 及与51单片机通讯使用指南.docx_第3页
第3页 / 共11页
VB mscomm 串口控件 及与51单片机通讯使用指南.docx_第4页
第4页 / 共11页
VB mscomm 串口控件 及与51单片机通讯使用指南.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

VB mscomm 串口控件 及与51单片机通讯使用指南.docx

《VB mscomm 串口控件 及与51单片机通讯使用指南.docx》由会员分享,可在线阅读,更多相关《VB mscomm 串口控件 及与51单片机通讯使用指南.docx(11页珍藏版)》请在冰豆网上搜索。

VB mscomm 串口控件 及与51单片机通讯使用指南.docx

VBmscomm串口控件及与51单片机通讯使用指南

一、概述

串口通讯作为一种古老而又灵活的通讯方式,被广泛地应用于PC间的通讯以及PC和单片机之间的通讯之中。

提到串口通讯的编程,人们往往立刻想到C、汇编等对系统底层操作支持较好的编程语言以及大串繁琐的代码。

实际上,只要我们借助相关ActiveX控件的帮助,即使是在底层操作一向不被人看好的VB中,一样能够实现串口通讯,甚至其实现方法和C、汇编相比,要更加快捷方便。

下面,笔者就介绍一下在VB中实现串口通讯的方法。

在VisualBasic中有一个名为MicrosoftCommunicationControl(简称MSComm)的通讯控件。

我们只要通过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。

下面,笔者就简要地介绍一下MSComm控件的使用方法。

二、MSComm控件的主要属性、事件

1、MSComm的属性

常用属性和方法  

利用MSComm控件实现计算机通信的关键是理解并正确设置MSComm控件众多属性和方法。

以下是MSComm控件的常用属性和方法:

 

●Commport:

设置通讯所占用的串口号。

如设成1(默认值),表示对Com1进行操作。

语法object.CommPort[value](value一整型值,说明端口号。

说明在设计时,value可以设置成从1到16的任何数(缺省值为1)。

但是如果用PortOpen属性打开一个并不存在的端口时,MSComm控件会产生错误68(设备无效)。

注意:

必须在打开端口之前设置CommPort属性。

●CTSHolding属性:

确定是否可通过查询ClearToSend(CTS)线的状态发送数据。

ClearToSend是调制解调器发送到相联计算机的信号,指示传输可以进行。

该属性在设计时无效,在运行时为只读。

语法:

object.CTSHolding(Boolean)

Mscomm控件的CTSHolding属性设置值:

TrueClearToSend线为高电平。

FalseClearToSend线为低电平。

说明:

如果ClearToSend线为低电平(CTSHolding=False)并且超时时,MSComm控件设置CommEvent属性为comEventCTSTO(ClearToSendTimeout)并产生OnComm事件。

ClearToSend线用于RTS/CTS(RequestToSend/ClearToSend)硬件握手。

如果需要确定ClearToSend线的状态,CTSHolding属性给出一种手工查询的方法。

  ●CommEvent:

这是一个非常重要的属性。

该属性设计时无效,运行时只读。

一旦串口发生通信事件或产生错误,依据产生的事件和错误,MSComm控件为CommEvent属性赋不同的代码,同时产生OnComm事件。

用户程序就可在OnComm事件处理程序中针对不同的代码,进行相应的处理。

CommEvent属性的代码、常数及含义参见表1及表2。

  

 表1 CommEvent通信事件 代码 常数 含义  

 1 ComEvReceive 接受到Rthreshold个字符。

该事件将持续产生,直到用Input属性从接受缓冲区中读取并删除字符。

 

 2 ComEvSend 发送缓冲区中数据少于Sthreshold个,说明串口已经发送了一些数据,程序可以用Output属性继续发送数据。

  

 3 ComEvCTS Clear To Send信号线状态发生变化。

  

 4 ComEvDSR Data Set Ready信号线状态从1变到0。

  

 5 ComEvCD Carrier Detect信号线状态发生变化。

  

 6 ComEvRing 检测到振铃信号。

  

 7 ComEvEOF 接受到文件结束符。

  

   

 表2 CommEvent通信错误 代码 常数 含义  

 1001 ComEvntBreak 接受到一个中断信号。

  

 1002 ComEvntCTSTO Clear To Send信号超时。

  

 1003 ComEvntDSRTO Data Set Ready信号超时。

  

 1004 ComEvntFrame 帧错误。

  

 1006 ComEvntOverrun 串口超速。

  

 1007 ComEvntCDTO 载波检测超时。

  

 1008 ComEvntRxOver 接受缓冲区溢出,缓冲区中已没有空间。

  

 1009 ComEvntRxParity 奇偶校验错。

  

 1010 ComEvntTxFull 发送缓冲区溢出,缓冲区中已没有空间。

  

 1011 ComEvntDCB 检索串口的设备控制块时发生错误。

  

●CDHolding属性:

通过查询CarrierDetect(CD)线的状态确定当前是否有传输。

CarrierDetect是从调制解调器发送到相联计算机的一个信号,指示调制解调器正在联机。

该属性在设计时无效,在运行时为只读。

语法object.CDHolding

设置值:

CDHolding属性的设置值为:

设置描述

TrueCarrierDetect线为高电平

FalseCarrierDetect线为低电平

说明:

注意当CarrierDetect线为高电平(CDHolding=True)且超时时,MSComm控件设置CommEvent属性为comEventCDTO(CarrierDetect超时错误),并产生OnComm事件。

注意在主机应用程序中捕获一个丢失的传输是特别重要的,例如一个公告板,因为呼叫者可以随时挂起(放弃传输)。

CarrierDetect也被称为ReceiveLineSignalDetect(RLSD)。

数据类型Boolean

●DSRHolding属性:

确定DataSetReady(DSR)线的状态。

DataSetReady信号由调制解调器发送到相连计算机,指示作好操作准备。

该属性在设计时无效,在运行时为只读。

语法:

object.DSRHolding

object所在处表示对象表达式,其值是“应用于”列表中的对象。

DSRHolding属性返回以下值:

TrueDataSetReady线高

FalseDataSetReady线低

说明:

当DataSetReady线为高电平(DSRHolding=True)且超时时,MSComm控件设置CommEvent属性为comEventDSRTO(数据准备超时)并产生OnComm事件。

当为DataTerminalEquipment(DTE)机器写DataSetReady/DataTerminalReady握手例程时该属性是十分有用的。

数据类型:

Boolean

●EOFEnable属性:

确定在输入过程中MSComm控件是否寻找文件结尾(EOF)字符。

如果找到EOF字符,将停止输入并激活OnComm事件,此时CommEvent属性设置为comEvEOF,

语法:

object.EOFEnable[=value]

EOFEnable属性语法包括下列部分:

value布尔表达式,确定当找到EOF字符时,OnComm事件是否被激活,如“设置值”中所描述。

●Error常数

常数值描述

comEventBreak1001接收到中断信号

comEventCTSTO1002Clear-to-send超时

comEventDSRTO1003Data-setready超时

comEventFrame1004帧错误

comEventOverrun1006端口超速

comEventCDTO1007Carrierdetect超时

comEventRxOver1008接收缓冲区溢出

comEventRxParity1009Parity错误

comEventTxFull1010传输缓冲区满

comEventDCB1011检索端口设备控制块(DCB)时的意外错误

●Handshake常数

常数值描述

comNone0无握手。

comXonXoff1XOn/Xoff握手。

comRTS2Request-to-send/clear-to-send握手。

comRTSXOnXOff3Request-to-send和clear-to-send握手皆可。

●Input:

从接收缓冲区中读取数据并清空该缓冲区,该属性设计时无效,运行时只读。

  

●InBufferSize:

设置或返回接收缓冲区的大小,缺省值为1024字节。

  

●InBufferCount:

设置输入寄存器所存储的字符数,当将其值设为0时,则输入寄存器将被清空。

  

●OutBufferSize:

设置或返回发送缓冲区的大小,缺省值为512字节。

  

●OutBufferCount:

设置输出寄存器所存储的字符数,当将其值设为0时,则输出寄存器将被清空.

●InputMode:

设置从输入寄存器中读取数据的形式。

常数值描述

comInputModeText0(缺省)通过Input属性以文本方式取回数据。

comInputModeBinary1通过Input属性以二进制方式检取回数据。

●InputLen属性:

设置并返回Input属性从接收缓冲区读取的字符数。

语法object.InputLen[=value]

InputLen属性语法包括下列部分:

value整型表达式,说明Input属性从接收缓冲区中读取的字符数。

说明:

InputLen属性的缺省值是0。

设置InputLen为0时,使用Input将使MSComm控件读取接收缓冲区中全部的内容。

若接收缓冲区中InputLen字符无效,Input属性返回一个零长度字符串("")。

在使用Input前,用户可以选择检查InBufferCount属性来确定缓冲区中是否已有需要数目的字符。

该属性在从输出格式为定长数据的机器读取数据时非常有用。

●Output:

向发送缓冲区发送数据,该属性设计时无效,运行时只读。

 

由于MSComm控件属性很多,在此笔者仅介绍与实现串口通讯密切相关的核心属性。

 

●Portopen:

设置串口状态,值为True时打开串口,值为False时关闭串口。

  

●Rthreshold:

该属性为一阀值。

当接收缓冲区中字符数达到该值时,MSComm控件设置Commevent属性为ComEvReceive,并产生OnComm事件。

用户可在OnComm事件处理程序中进行相应处理。

若Rthreshold属性设置为0,则不产生OnComm事件。

例如用户希望接收缓冲区中达到一个字符就接收一个字符,可将Rthreshold设置为1。

这样接收缓冲区中接收到一个字符,就产生一次OnComm事件。

 

在MSComm控件设置CommEvent属性为comEvReceive并产生OnComm之前,设置并返回的要接收的字符数。

语法object.Rthreshold[=value](value整型表达式,说明在产生OnComm事件之前要接收的字符数。

说明当接收字符后,若Rthreshold属性设置为0(缺省值)则不产生OnComm事件。

例如,设置Rthreshold为1,接收缓冲区收到每一个字符都会使MSComm控件产生OnComm事件。

●Sthreshold:

该属性亦为一阀值。

当发送缓冲区中字符数小于该值时,MSComm控件设置Commevent属性为ComEvSend,并产生OnComm事件。

若Sthreshold属性设置为0,则不产生OnComm事件。

要特别注意的是仅当发送缓冲区中字符数小于该值的瞬间才产生OnComm事件,其后就不再产生OnComm事件。

例如Sthreshold设置为3,仅当发送缓冲区中字符数从3降为2时,MSComm控件设置Commevent属性为ComEvSend,同时产生OnComm事件,如发送缓冲区中字符始终为2,则不会再产生OnComm事件。

这就避免了发送缓冲区中数据未发送完就反复发生OnComm事件。

 

语法object.SThreshold[=value]

value整形表达式,代表在OnComm事件产生之前在传输缓冲区中的最小字符数。

说明:

若设置Sthreshold属性为0(缺省值),数据传输事件不会产生OnComm事件。

若设置Sthreshold属性为1,当传输缓冲区完全空时,MSComm控件产生OnComm事件。

如果在传输缓冲区中的字符数小于value,CommEvent属性设置为comEvSend,并产生OnComm事件。

comEvSend事件仅当字符数与Sthreshold交叉时被激活一次。

例如,如果Sthreshold等于5,仅当在输出队列中字符数从5降到4时,comEvSend才发生。

如果在输出队列中从没有比Sthreshold多的字符,comEvSend事件将绝不会发生。

●OnComm常数

常数值描述

comEvSend1发送事件。

comEvReceive2接收事件。

comEvCTS3clear-to-send线变化。

comEvDSR4data-setready线变化。

comEvCD5carrierdetect线变化。

comEvRing6振铃检测。

comEvEOF7文件结束。

●Settings:

对串口通讯的相关参数。

包括串口通讯的比特率,奇偶校验,数据位长度、停止位等。

其默认值是“9600,N,8,1”,表示串口比特率是9600bit/s,不作奇偶校验,8位数据位,1个停止位。

语法:

object.Settings[=value]

说明:

当端口打开时,如果value非法,则MSComm控件产生错误380(非法属性值)。

Value由四个设置值组成,有如下的格式:

"BBBB,P,D,S"

BBBB为波特率,P为奇偶校验,D为数据位数,S为停止位数。

value的缺省值是:

"9600,N,8,1"

value的设置值:

True当EOF字符找到时OnComm事件被激活。

False(缺省)当EOF字符找到时OnComm事件不被激活。

说明:

当EOFEnable属性设置为False,OnComm控件将不在输入流中寻找EOF字符。

2、MSComm的事件

除了公共事件之外,MSComm只有一个OnComm事件。

当CommEvent属性值变化时将发生OnComm事件,指示发生一个通讯事件或错误。

当我们设置Rtheshold属性值为0时,将使得捕获comEvReceive事件无效。

MSComm控件提供了两种处理通信的方式:

一种为事件驱动方式,该方式相当于一般程序设计中的中断方式。

当串口发生事件或错误时,MSComm控件会产生OnComm事件,用户程序可以捕获该事件进行相应处理。

本文的两个例子均采用该方式。

另一种为查询方式,在用户程序中设计定时或不定时查询MSComm控件的某些属性是否发生变化,从而确定相应处理。

在程序空闲时间较多时可以采用该方式。

  

错误消息(MSComm控件)

下表列出MSComm控件可以捕获的错误:

值描述

380无效属性值comInvalidPropertyValue

383属性为只读comSetNotSupported

394属性为只读comGetNotSupported

8000端口打开时操作不合法comPortOpen

8001超时值必须大于0

8002无效端口号comPortInvalid

8003属性只在运行时有效

8004属性在运行时为只读

8005端口已经打开comPortAlreadyOpen

8006设备标识符无效或不支持该标识符

8007不支持设备的波特率

8008指定的字节大小无效

8009缺省参数错误

8010硬件不可用(被其它设备锁定)

8011函数不能分配队列

8012设备没有打开comNoOpen

8013设备已经打开

8014不能使用comm通知

8015不能设置comm状态comSetCommStateFailed

8016不能设置comm事件屏蔽

8018仅当端口打开时操作才有效comPortNotOpen

8019设备忙

8020读comm设备错误comReadError

8021为该端口检索设备控制块时的内部错误comDCBError

二、串口通讯编程实例

    在完成了对MSComm控件的简要介绍之后,笔者就以实际程序为例,介绍一下串口通讯的具体实现方法。

1、PC机间的串口通讯

  

(1)、实现方法:

A、新建一个窗体,在上面放两个Text控件、两个CommandButton控件和两个Label控件(如图1.bmp所示)。

具体见下表:

控件类型           名称            Caption属性          作用

Text                Text1            -------          输入所要发送的信息

Text                Text2            -------          显示接收到的信息

CommandButton       Command1         发  送           

CommandButton       Command2         退  出             

Label               Label1         发送的数据             提示

Label               Label2         接收的数据             提示

B、在控件工具箱中的空白处点击鼠标右键,在弹出的菜单中选择“部件”,在弹出的窗口中的控件列表中找到“MicrosoftCommControl”,将其选中,在点击“应用”、“关闭”,在控件工具栏中就会出现一个电话的小图标。

C、用串口线将两台电脑连接起来。

您可以使用Com1对Com1的对应连接,也可以使用Com1和Com2的交叉连接。

本程序使用的是Com1对Com1的连接。

D、输入以下代码:

PrivateSubCommand1_Click()

'...发送数据

MSComm1.OutBufferCount=0'...清空输出寄存器

MSComm1.Output=Text1.Text'...发送数据

EndSub

PrivateSubCommand2_Click()

'...退出

UnloadMe

EndSub

PrivateSubForm_Load()

'...初始化

MSComm1.CommPort=1'...使用Com1口

MSComm1.Settings="9600,n,8,1"'...设置通讯参数

MSComm1.PortOpen=True'...打开串口

EndSub

PrivateSubMscomm1_Oncomm()

'...通讯事件发生

SelectCaseMSComm1.CommEvent

CasecomEvReceive'...有接受事件发生

Text2.Text=MSComm1.Input'...接受显示数据

MSComm1.InBufferCount=0'...清空输入寄存器

EndSelect

EndSub

2、PC机与单片机之间的通讯

   PC机与单片机之间的通讯被广泛的用于工业、医疗测控等领域之中。

在应用中,我们通常将单片机作为“感受器”和“效应器”,负责数据采集、响应计算机发出的指令对电路进行控制,有时也进行一些简单的运算,最后再将执行数据反馈给计算机处理。

本程序将实现在PC机上输入一个0-255之间的整数,将此数据发送到单片机,单片机接收到数据后,将数据在显示管上显示,再将此数除以2,将得数返回给PC机。

(运行效果如图3.BMP所示)其实现方法如下:

    A、同PC机间通讯的实现方法A-B。

    B、连接电脑和单片机。

注意!

由于PC机端的RS232电平与单片机端TTL的并不不匹配,故应注意电平转换。

    C、在VB中输入以下代码:

PrivateSubMscomm1_Oncomm()

'...通讯事件发生

DimindataAsVariant

Dimbte(0)AsByte

SelectCaseMSComm1.CommEvent

CasecomEvReceive'...有接受事件发生

indata=MSComm1.Input

'...注意!

要通过MSComm控件发送或接收二进制数据必须用Variant类型的变量对二进

'...制Byte类型的变量进行转换!

bte(0)=AscB(indata)

Text2.Text=bte(0)

MSComm1.InBufferCount=0'...清空输入寄存器

EndSelect

EndSub

PrivateSubCommand1_Click()

'...发送数据

DimNumAsInteger

Dimoutbte(0)AsByte

Num=Val(Text1.Text)

outbte(0)=CByte(Num)

MSComm1.OutBufferCount=0'...清空输出寄存器

MSComm1.Output=outbte(0)'...发送数据

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1