vb mscomm控件在哪里出现8015错误,怎么解决

Pb6中的串行通信(MSCOMM32.OCX)完全解答版_数据库_领测软件测试网
中的串行通信 (MSCOMM32.OCX) 完全解答版 本文给出一个在PB6中如何采集串行口数据的实例及MSCOMM32.OCX控件的一些基本知识。 一:问题描述 本文解决的是采集磅房的磅值读取问题。磅秤和计算机 (COM1/COM2)之" name="description" />
Pb6中的串行通信(MSCOMM32.OCX)完全解答版
发表于:来源:作者:点击数:
Pb6 MI LY: 黑体; mso-ascii-font-family: Arial>中的串行通信 (MSCOMM32.OCX) 完全解答版 本文给出一个在PB6中如何采集串行口数据的实例及MSCOMM32.OCX控件的一些基本知识。 一:问题描述 本文解决的是采集磅房的磅值读取问题。磅秤和计算机 (COM1/COM2)之
&&&&&&&& Pb6<SPAN style=&FONT-FALY: 黑体; mso-ascii-font-family: Arial&>中的串行通信(MSCOMM32.OCX)完全解答版
&& 本文给出一个在PB6中如何采集串行口数据的实例及MSCOMM32.OCX控件的一些基本。
一:问题描述
本文解决的是采集磅房的磅值读取问题。磅秤和计算机(COM1/COM2)之间使用RS-232标准串行线相连。波特率为1200,数据格式如下:每100ms发送一组数据,每组数据有5帧,每帧11位,1位起始位(0),8位数据位(D0-D7),2位停止位(1),无奇偶校验.定义如下:
第1帧:D0—D7 ----0FFH(起始位)
第2帧:D0—D2 ----为小数点位置(0-5)
&&&&&&& D3&&&& -----NC
&&&&&&& D4&&&& -----1表示称重稳定& 0表示称重未稳定
&&&&&&& D5&&&& -----1表示称重为负& 0表示称重为正
&&&&&&& D6&&&& -----NC
D7&&&& -----1表示超载
第3帧:D0—D7 ----BCD1(称重值)
第4帧:D0—D7 ----BCD2(称重值)
第5帧:D0—D7 ----BCD3(称重值)
&&&&&&& BCD1,BCD2,BCD3为由低到高的称重值的BCD码。
使用中的MSCOMM32.OCX控件,先在PB中的OLE的insert control中注册该控件,如果注册完毕后使用时提示没有license ,则是没有注册码问题,网上提供了好多这方面的解决方法,但试过后都没能解决问题,我的解决方法是装VB,安装VB时一定要选择安装activeX。转完肯定能解决问题。
在窗口上添加该控件,名称为ole_1。在窗口的open事件里设置ole_1的属性。
ole_mport=1
ole_1.object.settings=&1200,n,8,1&
ole_1.object.portopen=true
ole_1.object.rthreshold= 10 //每次取10个字节,在10个字节中肯& 定包含一个完整//(5个字节)的磅值数据
ole_1.object.inputlen=1
ole_1.object.inputmode=0
各属性的意义在下面有详细的解释。
在ole_1控件的oncomm事件里添加如下代码
choose case ole_mevent
&&& case 2
&&& & &&&ole_1.object.Rthreshold=0&
&&&&&&& &string ls_t
&&&&&&& int ii
&&&&&&& int& w1,w2,w3,flag1,flag2
&&&&&&& for ii=1 to 10
&&&&&&& ls_t = ole_1.object.input
&&&&&&&& flag1 = asc(ls_t)&&&&&&&&&&&&&&&&&&& //取字节的数值
&&& &&&&& if flag1 = 255 then&&&&&&&&&&&&&&//判断是否为起始位
&&& &&&&&& ls_t = ole_1.object.input
&&& &&&&&& flag2 = asc(ls_t)
&&& &&&&& if flag2 = 8 then&&&&&&&&&&&&&& //判断数值是否正确
&&&&&&&&&&&& //读取BCD1, BCD2,BCD3的值&&&
& &&&&&&&& w1 = asc(ole_1.object.input)&
&&&&&&&&&&& w2 = asc(ole_1.object.input)
&&&&&&& &&& w3 = asc(ole_1.object.input)
&&& &&&&& end if
&&&&&&&& end if
&&&&&& next
//将BCD码转换为十进制数值
&&&& w1 = w1 - 6*int(w1/16)
&&&& w2 = w2 - 6*int(w2/16)
&&&& w3 = w3 - 6*int(w3/16)
//按高低位计算&&
&& st_1.text=string(w1 + w2*100+w3*10000)
&&&&//在次读取10个数值,触发oncomm事件
&&&&ole_1.object.Rthreshold=10&&
&& case 1006
&&&&&&& &&&& st_1.text=&over run&
&&& case 8020
&&& &&&&&&& st_2.text=&read comm device error&
&&& case 1001
&&&&&&& &&& & st_1.text=&break signal received&
&&& case&&& else
&&&&&&& &&&&&& st_1.text=string(ole_1.object.input)
&&&&&&& & &&&&&return
&&& end& choose
三& MSCOMM32控件的基本属性
&&& MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。MSComm控件在串口编程时非常方便,不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。&Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。
1.MSComm控件两种处理通讯的方式
MSComm控件提供下列两种处理通讯的方式:事件驱动方式和查询方式。&1.1 事件驱动方式
事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。这种方法的优点是程序响应及时,高。每个MSComm 控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。
1.2 查询方式&
查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。&
2.MSComm 控件的常用属性MSComm 控件有很多重要的属性,但首先必须熟悉几个属性。CommPort 设置并返回通讯端口号。&Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。&PortOpen 设置并返回通讯端口的状态。也可以打开和关闭端口。&Input 从接收缓冲区返回和删除字符。&Output 向传输缓冲区写一个字符串。下面分别描述:&CommPort属性 设置并返回通讯端口号。语法 mPort[value ] (value 一整型值,说明端口号。)&说明 在设计时,value 可以设置成从 1 到 16 的任何数(缺省值为 1)。但是如果用 PortOpen 属性打开一个并不存在的端口时,MSComm 控件会产生错误 68(设备无效)。注意:必须在打开端口之前设置 CommPort 属性。RThreshold 属性:在 MSComm 控件设置 CommEvent 属性为 comEvReceive 并产生 OnComm 之前,设置并返回的要接收的字符数。语法 object.Rthreshold [ = value ](value 整型表达式,说明在产生 OnComm 事件之前要接收的字符数。 )说明 当接收字符后,若 Rthreshold 属性设置为 0(缺省值)则不产生 OnComm 事件。例如,设置 Rthreshold 为 1,接收缓冲区收到每一个字符都会使 MSComm 控件产生 OnComm 事件。CTSHolding 属性:确定是否可通过查询 Clear To Send (CTS) 线的状态发送数据。Clear To Send 是调制解调器发送到相联计算机的信号,指示传输可以进行。该属性在设计时无效,在运行时为只读。语法: object.CTSHolding(Boolean)Mscomm 控件的 CTSHolding 属性设置值:True Clear To Send 线为高电平。&False Clear To Send 线为低电平。&说明:如果 Clear To Send 线为低电平 (CTSHolding = False) 并且超时时,MSComm 控件设置 CommEvent 属性为 comEventCTSTO (Clear To Send Timeout) 并产生 OnComm 事件。Clear To Send 线用于 RTS/CTS (Request To Send/Clear To Send) 硬件握手。如果需要确定 Clear To Send 线的状态,CTSHolding 属性给出一种手工查询的方法。详细信息 有关握手协议,请参阅 Handshaking 属性。SThreshold 属性: MSComm 控件设置 CommEvent 属性为 comEvSend 并产生 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 事件将绝不会发生。Handshake 常数常数 值 描述&comNone 0 无握手。&comXonXoff 1 XOn/Xoff 握手。&comRTS 2 Request-to-send/clear-to-send 握手。&comRTSXOnXOff 3 Request-to-send 和 clear-to-send 握手皆可。&OnComm 常数常数 值 描述&comEvSend 1 发送事件。&comEvReceive 2 接收事件。&comEvCTS 3 clear-to-send 线变化。&comEvDSR 4 data-set ready 线变化。&comEvCD 5 carrier detect 线变化。&comEvRing 6 振铃检测。&comEvEOF 7 文件结束。&Error 常数常数 值 描述&comEventBreak 1001 接收到中断信号&comEventCTSTO 1002 Clear-to-send 超时&comEventDSRTO 1003 Data-set ready 超时&comEventFrame 1004 帧错误&comEventOverrun 1006 端口超速&comEventCDTO 1007 Carrier detect 超时&comEventRxOver 1008 接收缓冲区溢出&comEventRxParity 1009 Parity 错误&comEventTxFull 1010 传输缓冲区满&comEventDCB 1011 检索端口 设备控制块 (DCB) 时的意外错误&InputMode 常数常数 值 描述&comInputModeText 0 (缺省)通过 Input 属性以文本方式取回数据。&comInputModeBinary 1 通过 Input 属性以二进制方式检取回数据。&CDHolding 属性:通过查询 Carrier Detect (CD) 线的状态确定当前是否有传输。Carrier Detect 是从调制解调器发送到相联计算机的一个信号,指示调制解调器正在联机。该属性在设计时无效,在运行时为只读。语法 object.CDHolding设置值:CDHolding 属性的设置值为:&设置 描述&True Carrier Detect 线为高电平&False Carrier Detect 线为低电平&说明:注意当 Carrier Detect 线为高电平 (CDHolding = True) 且超时时,MSComm 控件设置CommEvent 属性为 comEventCDTO(Carrier Detect 超时错误),并产生 OnComm 事件。注意 在主机应用程序中捕获一个丢失的传输是特别重要的,例如一个公告板,因为呼叫者可以随时挂起(放弃传输)。Carrier Detect 也被称为 Receive Line Signal Detect (RLSD)。数据类型 BooleanDSRHolding 属性:确定 Data Set Ready (DSR) 线的状态。Data Set Ready 信号由调制解调器发送到相连计算机,指示作好操作准备。该属性在设计时无效,在运行时为只读。语法:object.DSRHoldingobject 所在处表示对象表达式,其值是“应用于”列表中的对象。DSRHolding 属性返回以下值:值 描述&True Data Set Ready 线高&False Data Set Ready 线低&说明:当 Data Set Ready 线为高电平 (DSRHolding = True) 且超时时,MSComm 控件设置 CommEvent 属性为 comEventDSRTO(数据准备超时)并产生 OnComm 事件。当为 Data Terminal Equipment (DTE) 机器写 Data Set Ready/Data Terminal Ready 握手例程时该属性是十分有用的。数据类型:BooleanSettings 属性: 设置并返回波特率、奇偶校验、数据位、停止位参数。语法: object.Settings[ = value]说明:当端口打开时,如果 value 非法,则 MSComm 控件产生错误 380(非法属性值)。Value 由四个设置值组成,有如下的格式:&BBBB,P,D,S&BBBB 为波特率,P 为奇偶校验,D 为数据位数,S 为停止位数。value 的缺省值是:&9600,N,8,1&InputLen 属性:设置并返回 Input 属性从接收缓冲区读取的字符数。语法 object.InputLen [ = value]InputLen 属性语法包括下列部分:value 整型表达式,说明 Input 属性从接收缓冲区中读取的字符数。&说明:InputLen 属性的缺省值是 0。设置 InputLen 为 0 时,使用 Input 将使 MSComm 控件读取接收缓冲区中全部的内容。若接收缓冲区中 InputLen 字符无效,Input 属性返回一个零长度字符串 (&&)。在使用 Input 前,用户可以选择检查 InBufferCount 属性来确定缓冲区中是否已有需要数目的字符。该属性在从输出格式为定长数据的机器读取数据时非常有用。EOFEnable 属性:确定在输入过程中 MSComm 控件是否寻找文件结尾 (EOF) 字符。如果找到 EOF 字符,将停止输入并激活 OnComm 事件,此时 CommEvent 属性设置为 comEvEOF,语法:object.EOFEnable [ = value ]EOFEnable 属性语法包括下列部分:value 布尔表达式,确定当找到 EOF 字符时,OnComm 事件是否被激活,如“设置值”中所描述。&value 的设置值:True 当 EOF 字符找到时 OnComm 事件被激活。&False (缺省)当 EOF 字符找到时 OnComm 事件不被激活。&说明:当 EOFEnable 属性设置为 False,OnComm 控件将不在输入流中寻找 EOF 字符。错误消息(MS Comm 控件)下表列出 MSComm 控件可以捕获的错误:值 描述&380 无效属性值 comInvalidPropertyValue383 属性为只读 comSetNotSupported394 属性为只读 comGetNotSupported&8000 端口打开时操作不合法 comPortOpen8001 超时值必须大于 0&8002 无效端口号 comPortInvalid8003 属性只在运行时有效&8004 属性在运行时为只读&8005 端口已经打开 comPortAeadyOpen8006 设备标识符无效或不支持该标识符&8007 不支持设备的波特率&8008 指定的字节大小无效&8009 缺省参数错误&8010 硬件不可用(被其它设备锁定)&8011 函数不能分配队列&8012 设备没有打开 comNoOpen&8013 设备已经打开&8014 不能使用 comm 通知&8015 不能设置 comm 状态 comSetCommStateFailed8016 不能设置 comm 事件屏蔽&8018 仅当端口打开时操作才有效 comPortNotOpen&8019 设备忙&8020 读 comm 设备错误 comReadError8021 为该端口检索设备控制块时的内部错误 comDCBError&
原文转自:
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)求助,VB实现串口通信,但是一直显示错误8020,读comm设备错误_vb吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:96,603贴子:
求助,VB实现串口通信,但是一直显示错误8020,读comm设备错误收藏
Select mEvent
Case comEvReceivecount = MSComm1.InBufferCount
' 接收温度数据个数,两字节,低位在前
Inbyte = MSComm1.Input
' 接收温度数据
If count && 2 Then Exit Sub
' 不是两字节,表示接收错误,跳出程序
counter = counter + 1
' 基数器加1
For i = LBound(Inbyte) To UBound(Inbyte)
' 把接收的数据安十六进制格式放入缓冲中
buffer = buffer + Hex(Inbyte(i)) + Chr(32)
End Select
告别死工资:送150美金,可提取
显示错误在 Inbyte = MSComm1.Input
USB转的串口就会这样
楼主做的是温度采集?
楼主,问题解决了吗,遇到同样的问题
Public Sub 打开串口()Dim CC$With MSComm1.Settings = Trim(Text2.Text).InputMode = 1 &#39; 设置接受数据的类型是二进制类型数据.InputLen = 2 &#39; 一次性从接收缓冲区中读取所有数据(2个字节为一组).InBufferCount = 0 &#39; 清空接收缓冲区.OutBufferCount = 0 &#39; 清空发送缓冲区.SThreshold = 0 &#39; 一旦发送数据就触发OnComm()事件来检测是否返回数据.RThreshold = 2 &#39; 接收到2个字节数据就立即触发OnComm()事件.CommPort = Val(Text1.Text) &#39; 使用Text1中给的串口号.PortOpen=True &#39;打开串口End WithCC = &Com& & Trim(Text1.Text) & &:&If MSComm1.PortOpen = True ThenCC = CC & &已经成功打开!&ElseCC = CC & &打开失败!&End IfMsgBox CC, 0 + 64, &打开串口&End SubPrivate Sub Form_Load()Text1.Text = &3&Text2.Text = &9600,N,8,1& ‘  这个参数不对的话,应该在 Text2 中输入Call 打开串口End Sub&#39; 在 MSComm1_OnComm 事件中使用Private Sub MSComm1_OnComm()Dim Buffer As StringBuffer = MSComm1.Input&#39; ……End Sub&#39; 退出时请关闭端口 MSComm1.PortOpen = False
8020 错误一般是串口没有正常打开,请检查驱动程序和设备管理器。如果设备管理器中根本就没有你要打开的那个串口号,就要安装有关驱动程序。
我也有同样问题
宅男diao丝,射杀女神?这游戏你玩过没
遇到相同的问题,用电脑自发自收也是不行。请问有找到解决方案的吗?
挖坟专业的。。。。。。有下文没上文 猜谜大会你去召开吧
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(2504)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_081069',
blogTitle:'MSComm控件进行串口编程的基本步骤',
blogAbstract:'
Visual&C++为我们提供了一种好用的ActiveX控件Microsoft&Communications&Control(即MSComm)来支持应用程序对串口的访问,在应用程序中插入MSComm控件后就可以较为方便地实现对通过计算机串口收发数据。   要使用ActiveX控件MSComm,程序员必须将其添加入工程,其方法是:   (1)单击主菜单project的子菜单Add&To&project的Components&and&Controls选项;   (2)在弹出的\"Components&and&Controls&Gallery\"对话框中选择Registered',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:9,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'-1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}如何捕获MSComm控件的无效端口号出错(VB6.0)
Private Function funCommPortDetect(PortNumber As Integer) As
On Error Resume Next'//屏蔽错误&&&
PortNumber'//指定端口号&&&
MSComm0.PortOpen =
True'//打开端口&&&
If Err Then'//如果端口不存在产生错误&&&&&&&
funCommPortDetect =
-<span STYLE="CoLor: #'//返回-1&&&
Else'//端口存在返回当前端口号&&&&&&&
funCommPortDetect =
PortNumber
MSComm0.PortOpen =
False'//关闭打开的端口End
Function CommPortFix() As String
Dim intCommPortNumber As Integer,
blnFirst As Boolean
Dim strResult As String
On Error Resume Next&&&
'//屏蔽错误&&&
For intCommPortNumber = <span STYLE="CoLor: #
To <span STYLE="CoLor: #'//一般机器上不超过16个串口&&&&&&&
If funCommPortDetect(intCommPortNumber)
-<span STYLE="CoLor: # Then
&&&&&&&&&&&
strResult = strResult & " "
intCommPortNumber'//如果存在串口1,2,5.则结果strResult=1 2
CommPortFix =
strResult'//返回结果End
调用的时候直接令一字符变量strString=CommPortFix()即可,得到的字符串自己可以用Split处理.如果想先预处理,返回一个数组的话可以如下定义CommPortFix()函数:
Public Function CommPortFix() As String() Dim
intCommPortNumber As Integer,
blnFirst As Boolean Dim strResult As String On Error Resume Next '屏蔽错误
blnFirst = True
For intCommPortNumber = <span STYLE="CoLor: #
To <span STYLE="CoLor: # If
funCommPortDetect(intCommPortNumber)
-<span STYLE="CoLor: # Then
If blnFirst Then strResult = "COM"
& intCommPortNumber blnFirst = False
Else strResult = strResult & " "
& intCommPortNumber End If
End If Next
CommPortFix = Split(strResult, " ")
End Function
如果存在串口1,2,5,定义一个数组,Dim arrString() As
String,arrString=CommPortFix().这样arrString(0)="COM1",arrString(1)="COM2",arrString(2)="COM5".
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 vb中mscomm的input 的文章

 

随机推荐