怎样用VB实现RS232接口通信
字节位置 含义 数据 说明
1,2 帧头 0xAA 0xAA
3 数据长度 0x04 除帧头外数据长度
4 传感器地址0X02 232输出方式地址为2
5 命令 0xxx 命令罗盘输出数据帧
6 效验字 前面全部数据的异或结果
求怎样用MSComm控件实现命令。
不甚感谢!
我的程序是这样的:
Private Sub Command9_Click()
Dim b(4) As Byte
b(0) = &HAA
b(1) = &HAA
b(2) = &H4
b(3) = &H2
b(4) = &H1
MSComm1.Output = b()
buf = MSComm1.Input
Text1.Text = buf
End Sub
我用F8调试,运行到MSComm1.output=b()这一步,显示的是
MSComm1.output=<属性只写>,buf值是空的
是什么原因啊? 展开
推荐于2016-02-09 · 知道合伙人软件行家
VB可以使用MsComm控件来实现串口通信。
MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
MSComm 控件提供下列两种处理通讯的方式:
事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在 Carrier Detect (CD) 或
Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情况下,可以利用 MSComm 控件的 OnComm
事件捕获并处理这些通讯事件。OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅 CommEvent
属性。
OnComm 事件
无论何时当 CommEvent 属性的值变化时,就产生 OnComm 事件,标志发生了一个通讯事件或一个错误。
OnComm 事件示例
下例说明如何处理通讯错误和事件。可以在相关的 Case 语句之后插入代码来处理特定的错误或事件。
Private Sub MSComm_OnComm()
Select Case MSComm1.CommEvent
' 错误
Case comEventBreak ' 收到 Break。
Case comEventCDTO ' CD (RLSD) 超时。
Case comEventCTSTO ' CTS Timeout。
Case comEventDSRTO ' DSR Timeout。
Case comEventFrame ' Framing Error
Case comEventOverrun '数据丢失。
Case comEventRxOver '接收缓冲区溢出。
Case comEventRxParity ' Parity 错误。
Case comEventTxFull '传输缓冲区已满。
Case comEventDCB '获取 DCB] 时意外错误
' 事件
Case comEvCD ' CD 线状态变化。
Case comEvCTS ' CTS 线状态变化。
Case comEvDSR ' DSR 线状态变化。
Case comEvRing ' Ring Indicator 变化。
Case comEvReceive ' 收到 RThreshold # of chars.
Case comEvSend ' 传输缓冲区有 Sthreshold 个字符
Case comEvEOF ' 输入数据流中发现 EOF 字符
End Select
End Sub
MSComm 控件有很多重要的属性,但首先必须熟悉几个属性。
Output 属性,往传输缓冲区写数据流。该属性在设计时无效,在运行时为只读。
说明
Output 属性可以传输文本数据或二进制数据。用 Output 属性传输文本数据,必须定义一个包含一个字符串的
Variant。发送二进制数据,必须传递一个包含字节数组的 Variant 到
Output 属性。
正常情况下,如果发送一个 ANSI 字符串到应用程序,可以以文本数据的形式发送。如果发送包含嵌入控制字符、Null 字符等等的数据,要以二进制形式发送。
以下代码是在打开COM口后,能以二进制形式或字符串发送指令:
Option Explicit
Dim sjByt() As Byte
Private Sub Command1_Click() '2进制发送
ReDim sjByt(1 To 10) '设置为10个元素
sjByt(1) = &H31
sjByt(2) = &H32
sjByt(3) = &H12
sjByt(4) = &H31
sjByt(5) = &H32
sjByt(6) = &H33
sjByt(7) = &H34
sjByt(8) = &H35
sjByt(9) = &H36
sjByt(10) = &H37
MSComm1.Output = sjByt '此命令执行一次发送10字节
End Sub
Private Sub Command2_Click()'文本字符串发送
Dim sjStr As String
sjStr = "Dim sjStr As String"
MSComm1.Output = sjStr '此命令执行字符串发送
End Sub
dim DA(4) as Byte
DA(0)=&HAA
DA(1)=&HAA
DA(2)=&H04
DA(3)=&H02
DA(4)=.....
MSComm1.OutPut=DA()
*注意在VB中十六进制要用 &H 开头表示
发接为二进制发送,自然接收也是一样的,所以接收的也应该是一个Byte类型的不定变量数组,接收后可用 Ubound 语句来获取字节数,接收的数据以 变量(下标) 形式取得,不能将数组直接赋值于一个变量或控件的字符属性中。如:
Dim AD() As Byte
Dim Ik As Long
AD=MSComm.Input
For Ik=0 To Ubound(AD)
Text1.text=text1.text & Chr(AD(Ik))
Next
单片机+RS232通信模块实现Modbus RTU串口通信
等