关于VB串口通讯使用MSCOMM控件的问题,希望各位高手前来帮忙。。。。。。

lhg94081342 2007-10-15 03:22:59
现有电子秤一台,使用串口与计算机进行通讯。该电子秤为PR1613型仪表,输出为RS-232C标准接口,波特率为300-4800、无奇偶校验、7个数据位、1个停止位。所有字符均发送11位ASCII码,一个起始位。在VB中与串口通讯需要引入控件MSComm串口通讯控件(在Microsoft Comm Control 6.0中)。编写VB程序来访问串口,后VB连接一组态程序,达到VB读取电子秤上显示的数据,再传送到组态程序中,现主要问题是VB中的程序,组态程序可以解决。请各位高手多多给与帮助和建议,最好是程序的流程思路,谢谢。如果有类似的程序例子请让我学习学习。
...全文
658 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
UltraBejing 2008-04-30
  • 打赏
  • 举报
回复
不明LZ在说什么
lym616 2008-03-22
  • 打赏
  • 举报
回复
Len(Hex(bytInput(i))) = 1这是什么意思?
tingting1123 2007-10-24
  • 打赏
  • 举报
回复
呵呵 最近我也在写这个 有机会多多交流下
初始化打开串口-读取处理数据-显示保存数据-关闭串口
之前应该还要有个选取串口参数的
neteor 2007-10-22
  • 打赏
  • 举报
回复
这个程序是XK3130称重仪表的程序,你可以看一看
Private Sub Form_Load()
With MSComm1
If .PortOpen = True Then
MSComm1.PortOpen = False
End If
.InBufferSize = 200 '设置接收缓冲区为14个字节
.InputMode = comInputModeBinary
'.InputMode = comInputModeText '设置接收模式为十进制形式
.InputLen = 1 '设置一次从缓冲区读取一个字节
.InBufferCount = 0 '清除接收缓冲区
.RThreshold = 1 '接收一个字节产生ONCOMM事件
End With
If MSComm1.PortOpen = False Then
MSComm1.PortOpen = True
Else
MsgBox "端口已打开!", 64, "提示"
End If
End sub

Private Sub MSComm1_OnComm()
With MSComm1
Select Case .CommEvent '判断ONCOMM事件
Case comEvReceive '收到一个字节产生的接收事件
av = .Input '读取一个接收字节
ab(0) = av '转换保存到字节数据类型数组
'If ab(0) = 10 Then
If ab(0) = Chr(2) Then
.RThreshold = 0 '关闭ONCOMM事件
Do
DoEvents
Loop Until .InBufferCount >= 13
av = .Input
ab(2) = av
av = .Input
ab(3) = av
av = .Input
ab(4) = av
av = .Input
ab(5) = av
av = .Input
ab(6) = av
av = .Input
ab(7) = av
av = .Input
ab(8) = av
av = .Input
ab(9) = av
av = .Input
ab(10) = av
av = .Input
ab(11) = av
av = .Input
ab(12) = av
shuju = ab(3) + ab(4) + ab(5) + ab(6) + ab(7) + ab(8)

Select Case ab(9) '取小数点位置数据,定义小数点位数
Case 1
s = 10
f = "0.0" '一位小数
Case 2
s = 100
f = "0.00" '二位小数
Case 3
s = 1000
f = "0.000" '三位小数
End Select

Select Case ab(2)
Case "+"
Text1.Text = Format(shuju / s, f) '显示仪表数据,符号为正
Case "-"
Text1.Text = Format(shuju / -s, f) '显示仪表数据,符号为负
End Select
.InBufferCount = 0 '清除接收缓冲区
Erase ab()
.RThreshold = 1 '打开ONCOMM事件接收

End If
Case Else
'Text1.Text = "数据错误!"
End Select
End With
End Sub


newnazi 2007-10-16
  • 打赏
  • 举报
回复
用 调试助手 能否收到数据?
lhg94081342 2007-10-16
  • 打赏
  • 举报
回复
zdingyun谢谢你的帮助,请留下你的邮箱地址,以方便我向你请教,我的邮箱是94081342@163.com
zdingyun 2007-10-15
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20070427/03/16415e91-4833-49f3-96ff-8ec17b5a5160.html
参阅上述连接,是关于计算机与电子秤串口通信问题的讨论.
有问题发消息或在此贴讨论.
lhg94081342 2007-10-15
  • 打赏
  • 举报
回复
先谢谢你的帮忙,这些关于MSCOMM控件的属性和事件我都有些了解,只是这是我第一用这个控件做程序,所以脑袋里一直没有整个程序流程的概念,不知道有没有比较代表的程序可以拿来让我参考参考,我的邮箱是94081342@163.com谢谢。
tianhuo_soft 2007-10-15
  • 打赏
  • 举报
回复
MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。 Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的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属性 设置并返回通讯端口号。
语法 object.CommPort[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 属性以文本方式取回数据。

1,453

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧