VB和51单片机串口通信讲解_第1页
VB和51单片机串口通信讲解_第2页
VB和51单片机串口通信讲解_第3页
VB和51单片机串口通信讲解_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-.z.VB和51单片机串口通信讲解mport;设置或返回串口号。SettingS:以字符串的形式设置或返回串口通信参数。Portopen:设置或返回串口状态。InputMode:设置或返回接收数据的类型。Inputlen:设置或返回一次从接收缓冲区中读取字节数。InBufferSize:设置或返回接收缓冲区的大小,缺省值为l024字节。InBufferCount:设置或返回接收缓冲区中等待计算机接收的字符数。Input:从接收缓冲区中读取数据并清空该缓冲区,该属性设计时无效,运行时只读。OutBufferSize:设置或返回发送缓冲区的大小,缺省值为512字节。OutBufferCount:设置或返回发送缓冲区中等待计算机发送的字符数。Output:向发送缓冲区发送数据,该属性设计时无效,运行时只读。设置好这些属性和方法,程序很容易就可以编出来了,其中要注意的是串口的波特串设置,Onm事件的程序编写。

程序的设计是这样的,计算机向单片机发送一个’S’,表示通信开场。然后紧接着又发送9个字符,其中最后一个字符是前面9个字符〔包括’S’〕的校验和。单片机正确接收到10个字符后,把10个字符从新又送回来。//---------------------------------------初始化串口设计-----------------------------

PrivateSubForm_Load()m1.Setting="9600,n,8,1,"

’设置波特率和发送字符格式m1.mPort=1

’设置通讯串口m1.InputLen=0

’设置或返回一次从接收缓冲区中读取字节数,0表示一次读取所有数据m1.InBuffersize=512m1.InBufferCount=0m1.OutBufferCount=0m1.Rthreshold=1m1.PortOpen=TrueEndSub

’翻开串口//--------------------------------------给单片机发送’S’,开场通信-----------------------------

PrivateSubmand1_C1ick()Timer1.Enabled=TrueEndSubPrivateSubmand2_C1ick()Varbuffet=“S〞

m1.Ouput=varbuffeTimer2.Enabled=TrueEndSubPrivateSubForm_Unload(CancelAsInteger)m1.PortOpen=FalseEndSub//---------------------------------------向单片机发送数据-----------------------------

PrivateSubTimer2_Timer()Outputsignal=Str(Te*t2.te*t)

’向单片机发送数据Temp(1)=Cbyte(outputsignal)Varbuffer=tempml.Output=varbufferTimer2.Enabled=FalseEndSub//---------------------------------------接收单片机发送的数据,并显示-----------------------------

PrivateSubm1_Onm()SelectCasem1.mEvent

’设置onm事件,读取片机存的值CaseEvReceiveInputsignal=m1.InputTe*t1.Te*t=Asc(Inputsignal)

’单片机存的值用te*tbo*显示出CaseElseEndselectEndSub关于MSM控件的一些说明

VB5.0/6.的MSm通信控件提供了一系列标准通信命令的接口,它允许建立串口连接,可以连接到其他通信设备〔如Modem〕.还可以发送命令、进展数据交换以及监视和响应在通信过程中可能发生的各种错误和事件,从而可以用它创立全双工、事件驱动的、高效实用的通信程序。但在实际通信软件设计过程中,MSm控件并非像想像中那样完美和容易控制.特别是在中文Wln95/98下通信时更会出现问题。下面就从根底开场介绍,然后逐步讨沦MSm控件在编程中出现的问题以及编程技巧。一、用MSm控件通信1.串口通信根底知识

一般悦来,计算机都有一个或多个串行端口,它们依次为1、2、…,这些串口还提供了外部设备与pC进展数据传输和皿信的通道。这些串口在CPU和外设之间充当解释器的角色。当字符数据从CPU发送给外设时,这些字符数据将被转换成串行比特流数据;当接收数据时,比特流数据被转换为字符数据传递给CPU,再进一步说,在操作系统方面,Windows用通信驱动程序〔M.DRV〕调用API函数发送和接收数据,当用通信控件或声明调用API函数时,它门由M.DRV解释并传递给设备驱动程序,作为一个vB程序员,要编写通信程序.只需知道通信控件提供应Windows通信AP1函数的接口即可.换句话说,只需设定和监视通信控件的属性和事件即可。2.使用Msm控件在开场使用MSm控件之前。需要先了解其属性、事件或错误属性

描述mPort

设置或返回通信端口号Settings

以字符串的形式设置或返回波特率、奇偶校验、数据位和停顿位PortOpen

设置或返回通信端口的状态。也可以翻开和关闭端口Input

返回和删除接收缓冲区中的字符Output

将字符串写入发送缓冲区mEvent属性为通信事件或错误返回以下值之一。在该控件的对象库中也可以找到这些常量。常量

描述EventBreak

1001

收到了断开信号EventCTSTO

1002

ClearToSendTimeout。在发送字符时,在系统指定的事1件,CTS〔ClearToSend〕线是低电平EventDSRTO

1003

DataSetReadyTimeout。在发送字符时,在系统指定的事件,DSR〔DataSetReady〕线是低电平EventFrame

1004

数据帧错误。硬件检测到一个数据帧错误EventOverrun1006

端口溢出。硬件中的字符尚未读,下一个字符又到达,并且丧失EventCDTO

1007

CarrierDetectTime。在发送字符时,在系统指定的事件,CD〔CarrierDetect〕线是低电平。CD

也称为RLSD〔ReceiveLineSingalDetect,接收线信号检测〕EventR*Over1008

接收缓冲区溢出。在接收缓冲区中没有空间EventR*Parity1009

奇偶校验错。硬件检测到奇偶校验错误7EventT*Full1010

发送缓冲区满。在对发送字符排队时,发送缓冲区满EventDCB

1011

检取端口DCB〔DeviceControlBlick〕时发生了没有预料到的错误通信事件包含了下面的设置:常量

描述EvSend

1

发送缓冲区中的字符数比Sthreshold值低EvReceive

2

接收到了Rthreshold个字符。持续产生该事件,直到使用了Input属性删除了接收缓冲区中的数据EvCTS

3

CTS〔ClearToSend〕线改变EvDSR

4

DSR〔DataSetReady〕线改变。当DSR从1到0改变时,该事件发生EvCD

5

CD〔CarrierDetect〕线改变EvRing6检测到响铃信号。一些URAT〔UniversalAsynchronousReciver-

-Transmitters,通用异步收发器〕不支持该事件EvEOF

7

收到了EOF字符〔ASCII字符26〕Error消息〔MSm控件〕下表列出了MSm控件可捕获的错误消息:常量

描述InvalidPropertyValue

380

无效的属性值SetNotSupported

383

属性只读GetNotSupported

394

属性只读PortOpen

8000

端口翻开时该存在无效

8001

超时设置必须比0值大PortInvalid

8002

无效的端口号

8003

属性只在运行时有效

8004

属性在运行时是只读的PortAleadyOpen

8005

端口已经翻开

8006

设备标识符无效或不支持

8007

不支持设备的波特率

8008

指定的字节大小无效

8009

缺省参数错误

8010

硬件不可用〔被其他设备锁住〕

8011

函数不能分配队列NoOpen

8012

设备没有翻开

8013

设备已经翻开

8014

不能使用通信通知SetmStateFailed

8015

不能设置通信状态

8016

不能设置通信事件屏蔽PortNotOpen

8018

该存在只在端口翻开是有效

8019

设备忙ReadError

8020

通信设备读错误DCBError

8021

检取端口设备控制块时出现部错误搞清楚以上根本属性后,就可以开场编写通信许程序了。在VB5.0/6.0中新建一个工程文件。添加MicrosoftmControl5.0组件,在简体Form1中参加mand命令按钮并取名为CmdTest,MSm控件取名为MSm1,参加如下程序代码。PrivateSubcmdTestClick()

'翻开串口MSml.mPort=2

'设定2IfMSml.PortOpen=FalseThenMSm1.Settings="9600,n,8,1"

'9600波特率,无校验,8位数据位,1位停顿位MSm1.PortOpen=True

'翻开串口EndifMSm1.OutBufferCount=0

'清空发送缓冲区MSm1.InBufferCount=0

'滑空接收缓冲区'发送字符数据时注意必须用回车符〔vbcr〕完毕MSm1.Output="Thisisaqoodbook!"&vbCr'泼打或发送AT命令MSm1.Output="ATDT,&vbCr'发送字符数组数据时注意ByteArray必须事先定义赋值DimByteArrayasbyte()'定义动态数组ReDimByteArray(1)'重定义数组大小ByteArray(0)=0ByteArray(1)=1MSm1.Output=ByteArrayEndSubprivateSubMSmEvent()SelectCaseMSm1.mEventCaseEvReceiveDimBufferAsVariantMSm1.InputLen=0'接收二进制数据MSm1.InputMode=InputModeBinaryBuffer=MSm1.Input'接收字符数据MSm1.InputMode=InputModeTe*tBuffer=MSml.InputCaseelseEndSelectEndsub(程序1)二、中文Win95/98下的通信问题与解决方法1.接收的数据少于发送的数据

如果通过MSm控件一次性传送较多的二进制数据,则,很可能收到的数据缺乏。例如在设置为24oobps传输率的情况下,一次性可以传输2048个字符数据则在大多数情况下。一次只能收到1200个字符左右,这址出为新版的MSm32.OC*中存在一个影响传输二进制数据的臭虫〔bug〕.注意这不是特性。

32位WindowsAPI函数〔以下简称API〕使用了几个用MTIMEOUTS构造表示的限时变量,WriteTotalTimeOutConstant即是其中的一个,它被Windows部设定为5000〔即5秒〕,这个常量决定了在通信驱动程序停顿传输之前花费在发送缓冲区中数据的时间的长短,5秒钟意味着通信速度为1200bps情况下仅能发送600个字符,24oobps情况下仅能发送1200个左右的字符。事实上,在一个缓冲区一次性发送更多的数据是非常可能的。这个bug同样也能引发问题,甚至在高速串口门通信情况下,即使系统在使用流控制,无论丛软件流〔*on/*ofI〕还是硬件流〔CTS/RTS〕。假设数据在发送缓冲区中时,流控制停顿了传输,如果停顿时间超过5秒钟.则数据就会丧失。在*些环境下,5秒钟可能相当短.不过也不必担忧,VB5.0/6.0版本的MSm控件有一个新增的重要的属性称为mID,mID指的是当串口被翻开时,被API所调用的串口句柄或称标志,这也意味着能利用API接口函数去修改这个常量。每次串口关闭后,Windows会自动将之恢复为5000,所以,每次翻开串口后需要重斩设定以下API声明,其代码见下程序。TypeMTIMEOUTSReadIntervalTimeoutAsLongReadTotalTimeoutMultiplierAsLongReadTotalTimeoutConstantAsLongWriteTotalTimeoutMultiplierAsLongWriteTotalTimeoutConstantAsLongEndTypeDeclareFunctionSetmTimeoutsLib"Kernel32"(BYValhFileAsLong,lpmTimeoutsAsMTIMEOUTS)AsLongDeclareFunctionGetmTimeoutsLib"Kernel32"(ByValhFileAsLong,lpmTimeoutsAsMTIMEOUTS)AsLongDimtimeoutsAsMEOUTSDimRetAsLongIfm1.PortOpen=FalseThenm1.PortOpen=TrueEndifRet=GetmTimeouts(m1.mID,timeouts)'SetsomedefaulttimeoutstimeOuts.ReadIntervalTimeout=1timeouts.ReadTotalTimeoutMultiplier=1timeouts.ReadTotalTimeoutConstant=1timeouts.WriteTotalTimeoutMultiplier=1timeouts.WriteTotalTimeoutConstant=(m1.OutBufferSize\Val(m1.Settings))*10000+1000Ret=SetmTimeouts(m1.mID,timeouts)(程序2)2.如何发送大于128的字符数据

在通信程序中,以单字符方式逐个发送数据时,每一个数据围0-255〔即十六进制的00-FF〕。在单字符版本的英文Win95或DOS版的BASIC程序中,只需要将相应的数据转换成相应的字符发送到通信端口即可。但在中文Win95/98下却行不通,假设在中文Win95/98下运行以下程序:DimiFori=0to255MSm1.Output=chr(i)Ne*ti

希望在接收端得到预期的0-255之间的数据,结果却是:前129个数据接收正确,为0-128,后面127个数据为126个0和一个255,造成这种给果的原因在于中文Windows使用的是双字节字符集〔DBCS〕系统。DBCS系统使用0-128之间的数字表示ASCII字符,大于128的数字仅作为前导字符,它只是显示是一个非拉丁语系的字符,而并不代表实际意义。上述程序在调用CHR〔〕函数时用到了DBCS字符集,冈此产生了此类错误。则,如何发送人于128的数据呢?答案是使用字符数组,将以上程序改为:Dimcc(255)AsByteFori=0To255cc(i)=iNe*tiMSm1.Output=ccDoDoEventsLoopUntilMSm1.OutBufferCount=0'接收过程MSm1_Onm()SelectCaseMSm1.mEventCaseEvReceiveDimBufferAsVariant,b1,iMSm1.InputMode=InputModeBineryMSm1.InputLen=0Buffer=MSm1.InputFori=LBound(Buffer)ToUBound(Buffer)Debug.PrintBuffer(i);Ne*tiCase.....

3.如何发送0字符〔00H,NULL〕在VisuaIC++中使用串口控件发送0字符有些麻烦,但在VB5.0/6.0中只要注意以下两点即可:〔1〕设置MSm控件的属性NullDiscard=False;。〔2〕使用二进制接收,即用MSm1.InputMode=InputModeBinary便可以解决问题;

4.如何发送递中文字符串〔DBcS字符〕VB5.0/6.0的各种参考书上均指明MSm通信控件不能发送或接收双字节字符集系统DBCS〕的二进制数据,这对于我国及亚洲一些使用DBCS字符集的国家不能不说是一大人遗憾。但是我在实践中发现,用MSm控件也可以发送中文字符,具体方法有以下两种:〔1〕直接发送

直接发送即把中文字符等同于英文字符。如:MSm1.Intput="这是一行中文数据!",但这种方法发送的中文数据不能太长,发送缓冲区和接收缓冲区的大小需设定为中文字符的两倍以上,而且发送与接收系统所处的操作系统版本最好要一致,否则会出现接收或发送缓冲区溢出之类的错误。这种方法时用于一般要求不太高的场合。〔2〕间接发送

在发送端将汉字或字符转换为机器码或区位码数据数组,然后将咏转换后的数据发送到串口,在接收端接收到数据后,按照相反的顺序得到的数据转换为相应的汉字或字符,在转换过程中.要用到位运算,如取得汉字的码后需要将高字节和低字节分开,而VB5.0/6.0中并没有提供此类函数,以下是求整数高、低字节的函数。PublicFunctionHiByte(aAsInteger)Dimbb=aAnd&HFF00b=b/256Ifb<0Thenb=b+256HiByte=bEndFunctionPublicFunctionLowByte(aAsInteg`er)Dimbb=aAnd&HFFLowByte=bEndFunction5.如何用单机进展通信测试

通常在写好了通信程序后需要两台PC或一台Pc、一台单片机.将通信口连接后进展测试,但很多时侯因条件限制仅有单台PC机,测试工程很简单,则能否测试呢?当然可以,而且方法也很简单。对于九针的串口,找一个废弃的串口鼠标,剥外鼠标线,将连接2、3针的线对接即可;对于25针的串口,找一枚曲别针〔最好有塑料外套的〕将它扯直,剥削去两头的塑料后在两头各弯一个圆圈,中间对忻后直接套接在串口的2、3针上即可。如果但心不够平安,则可以将5针按地。'''

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论