首页 VB串口数据接收方式

VB串口数据接收方式

举报
开通vip

VB串口数据接收方式1、在OnComm事件中接收数据:这种方式能充分MSCOMM控件的特性。OnComm事件还可以检查和处理通讯错误;可以通过检查CommEvent属性的值来查询事件和错误;对于不定长数据以及对数据进行处理比较复杂的情况,此法不是很方便。PrivateSubMSComm_OnComm()SelectCaseMSComml.CommEvent'错误CasecomEventBreak'收到Break。CasecomEventCDTO'CD(RLSD)超时。CasecomEventCTSTO'CTSTimeoutCaseco...

VB串口数据接收方式
1、在OnComm事件中接收数据:这种方式能充分MSCOMM控件的特性。OnComm事件还可以检查和处理通讯错误;可以通过检查CommEvent属性的值来查询事件和错误;对于不定长数据以及对数据进行处理比较复杂的情况,此法不是很方便。PrivateSubMSComm_OnComm()SelectCaseMSComml.CommEvent'错误CasecomEventBreak'收到Break。CasecomEventCDTO'CD(RLSD)超时。CasecomEventCTSTO'CTSTimeoutCasecomEventDSRTO'DSRTimeoutCasecomEventFrame'FramingErrorCasecomEventOverrun'数据丢失。CasecomEventRxOver接收缓冲区溢出。CasecomEventRxParity'Parity错误。CasecomEventTxFull传输缓冲区已满。CasecomEventDCB'获取DCB]时意外错误'事件CasecomEvCD'CD线状态变化。CasecomEvCTS'CTS线状态变化。CasecomEvDSR'DSR线状态变化。CasecomEvRing'RingIndicator变化。CasecomEvReceive'收到RThreshold#ofchars.CasecomEvSend'传输缓冲区有Sthreshold个字符'CasecomEvEof'输入数据流中发现EOF字符EndSelectEndSub2•轮循法采集数据:A、定时器轮循法对于数据包方式收发数据以及不需即时响应情况,用轮循法更好些。实际上轮循法最大的好处在于集中处理数据而且不太占用CPU。轮循法要注意定时采集的时间片段大小;这里用二进制收发模式;使属性RThreshold、SThreshold为0,屏蔽ONCOMM事件。InputMode=comInputModeBinaryRThreshold=0SThreshold=0PrivateSubTmrComm_Timer()'采用轮循法采集数据DimRx_buff()AsByteDimokstringAsStringDimReceivedLenAsIntegerOnErrorGoToErrorHandlerTmrComm.Enabled=False关闭定时器Ifcommport.InBufferCount>0ThenReceivedLen=commport.InBufferCountRx_buff=commport.Inputokstring=StrConv(tempbyte,vbUnicode)IfReceivedLen=6ThenIfChr(tempbyte(0))=":"Andtempbyte(3)=&hOaThenEndIfIfInstr(okstring,":@END*",vbBinaryCompare)ThenEndIfEndIfTmrComm.Enabled=True打开定时器EndSubB、直接轮循法此法用于接收少量控制命令字;'保存输入子串的缓冲区DimInstringAsString'使用C0M1。MSComml.CommPort=1'9600波特,无奇偶校验,8位数据,一个停止位。MSComm1.Settings="9600,N,8,1"'当输入占用时,'告诉控件读入整个缓冲区。MSComm1.InputLen=0'打开端口。MSComm1.PortOpen=True'将attention命令送到调制解调器。MSComm1.Output="ATV1Q0"&Chr$(13)'确保'调制解调器以"OK"响应。'等待数据返回到串行端口。DoDoEventsBuffer$=Buffer$&MSComm1.InputLoopUntilInStr(Buffer$,"OK"&vbCRLF)'从串行端口读"OK"响应。'关闭串行端口。MSComml.PortOpen=False如何处理不定长数据的接收在处理串口通讯时,经常会遇到不定长数据的接收。由于通讯任务不同及编程要求的差异所以采用的方法也有所不同。本文就此问题进行探讨。不定长数据从数据格式上分,可分为有格式和无格式。一、无格式不定长数据的接收这种格式在实际串口通讯中用得不多,一般只用传送字符串数据。问题在于怎么判断接收结束。一般用时间延迟的方法解决。A、对于非握手式通讯,可用一个定时器定时轮循接收,并假定每个轮循接收完成。用ONCOMM事件接收也可,只是不如定时器定时轮循接收简便。B、对于握手方式通讯,可用直接轮循法提高接收的准确性。下面是实现此法的函数:FunctionsComm(sCommandAsString,comReceiveAsMSComm)AsStringDimnReceiveCountAsIntegerIfcomReceive.PortOpen=FalseThencomReceive.PortOpen=TrueEndIfcomReceive.Output=sCommandDonReceiveCount=comReceive.InBufferCountsleep⑵'API函数,挂起当前进程一段时间LoopUntilcomReceive.InBufferCount=nReceiveCountIfcomReceive.PortOpen=TrueThensComm=comReceive.InputEndIfEndFunction注:此函数参照了xth一文。此法一般是能确保数据接收的正确,但由于WINDOWS是多任务操作系统,当有耗时的进程运行时会丢失数据。如果系统会出现这种情况,可增大函数sleep()的参数值。二、不定长格式数据的接收对于不定长数据接收最好的方法是制定通讯 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 ,比如定义开始字符和结束字符。由于单片机系统通讯一般不太复杂,没必要去制定一套象通用计算机间通讯的协议,而根据单片机系统的大小和性能要求制定通讯协议。实际上为便于交流、维护以及一致性,可制定一套可伸缩的通讯协议。定义了开始字符和结束字符就容易实现不定长格式数据通讯,但在实际通讯编程还是容易出现一些比较隐蔽的通讯错误。下面就常用方法分别进行分析。A、定时器轮循法。假定每个轮循期数据接收完毕,并在每个轮循期处理数据,由于有开始字符和结束字符很容易确定接收数据的完整性。好象合理设定轮循时间值就万无一失了,但被动接收数据时无论如何也找不合适的轮循时间值,因为启动定时器和数据到来基本不同步,这就会出现一次发送的数据被分在两个轮循期接收,所以被动接收数据时不能假定每个轮循期数据接收完毕。在接收到结束字符后才确定一次数据接收完毕就可解决此问题。B、OnComm事件法。方法和定时器轮循法基本相同,因为每次OnCommg事件也只能接收到一部分数据。在VB的在线帮助中这样注解“设置Rthreshold为1,接收缓冲区收到每一个字符都会使MSComm控件产生OnComm事件。"。但实际上OnComm事件并不是每收到一个字符便触发一次OnComm事件。OnComm事件是在缓冲区收到几个甚至几十个字节数据后才被触发的。版主认为这是WINDOWS多任务使操作系统不能实时响应造成的。如果要在每次OnComm事件接收一个字符似乎可设INPUTLEN属性为1,但实际行不通。VB在线帮助中“有该属性在从输出格式为定长数据的机器读取数据时非常有用”的注解,好象在说对定长字符有效,但版主发现INPUTLEN设为16,接收16个字符定长数据时却被当作两次接收了,一次12个,一次4个。建议在OnComm事件中接收数据要定义通讯协议并检测数据的完整性。对于不定长格式数据的接收程序员更喜欢定时器轮循法,也许OnComm事件不好控制吧。对于不定长数据的接收,最佳方法可能是在OnComm事件中启动定时器轮循接收,并同时停止OnComm事件的触发,接收完毕后或超时开启OnComm事件。用字符方式收发码值大于127的字符数据VB的通讯控件友好、功能强大,编程速度快是众人皆知的。加上VB的易学、易用,快速开发等特点,数据通讯量不是很大时,在单片机通讯领域广泛地使用VB开发PC上层通讯软件。实际开发时会有不少问题,这里就用字符方式收发码值大127的字符数据进行讨论。在实际开发中经常遇到通讯只是用来发送一些控制字符命令和少量数据。在VB的中文在线帮助中有“若数据只用ANSI字符集,则用comlnputModeText”的表述。ANSI字符集是0-127这容易使人误解为&h88也可用“INPUTMIDE=comInputModeTexf方式收发。我刚开始用VB编通讯模块时就为此迷惑过,网上不少网友也时常问及这种问题。实际上在VB中0-127是可以正常收发的,大于127即&H7F的只有&H80和&HFF能够收发,其余ANSI字符都被过滤为0。由于串口通讯是以字节收发的,数据如以comInputModeText模式收发则非字符串数据会被过滤。在VB中用“INPUTMIDE=comlnputModeBinary”就可以解决这个问题,只是收发都必须用动态数组来完成。用comInputModeBinary模式编程稍有点复杂,调试也不直观,对于初学者不易掌握。另外软件完成后,在实际应用时会增加工程维护难度,因为对于二进制代码不是易于理解的。比如下端机发送现场统计数据233,comInputModeBinary模式下串口监测到“:A&H233;",它代表A探针的温度。一般串口监测软件要么用ASCII方式显示,要么用二进制方式显示。用ASCII方式则不能看到&H233,而二进制方式则示不好理解,如果显示586523359,我想没有人喜欢这种方式(如果有更好的方式的话)。但如果显示“:A233;”不就解决问题了!用comInputModeText方式就可完成任务了,只是多了一段数据分离程序。对于一般通讯要求这种方法不为是一种好方法。由于通讯任务是多种多样的,有时候这种方法就有点力不从心了,如传送较多的的数据时,这会显著地增加通讯量,通讯变得复杂了,对于单片机系统就不太合适了;还有一些特殊要求,如数据包的识别符也不适此法,但能确定传送数据码值范围也可用此法。下面介绍另一种方法,此法适用比较广,传送二进制数据通讯量增加也不大。这种方法实际上很简单,实际运用中有不少采用此法。原理是一码分为二码。如设7E为临界字符,对于7E则分为7E和0两个ASCII码,依此类推,8F分为7E和11。接收合并时遇到7E则将7E和后一个ASCII码相加为下字符。下面给出C语言函数,VB转换一下便可。
本文档为【VB串口数据接收方式】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: ¥15.0 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
xiaobingbing
暂无简介~
格式:doc
大小:14KB
软件:Word
页数:5
分类:建筑/施工
上传时间:2022-11-16
浏览量:17