首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

RS485通讯的 请一上

2012-12-15 
RS485通讯的求助 请高手指点一下我需要MSCOMM控件 发送指令到RS485 终端会反馈一组字符 但问题是指令是类

RS485通讯的求助 请高手指点一下
我需要MSCOMM控件 发送指令到RS485 终端会反馈一组字符 但问题是指令是类似“86 01 05 0F 12”一类的 而我找的代码中是byte 写出的是&HFF &HAA这样的 我不知道指令如何转换为我需要的指令啊 菜鸟求教高手指导一下 多谢了。代码如下:
Private Sub Form_Load()
    MSComm1.CommPort = 1 '利用串口COM1进行通讯
    MSComm1.InputLen = 0 '每次读取接收缓冲区的1个字节
    MSComm1.OutBufferSize = 512 '设置发送缓冲区为512字节
    MSComm1.InBufferSize = 512 '设置接收缓冲区为2048字节
    MSComm1.OutBufferCount = 0 '清除发送缓冲区
    MSComm1.InBufferCount = 0 '清除接收缓冲区
    MSComm1.InputMode = comInputModeBinary '数据传输设置为二进制格式
    MSComm1.RThreshold = 1   '一次性接收起始码1个字节'可触发On_Comm
    MSComm1.Settings = "2400,N,8,1" '设置波特率、校验位(1)、数据位、停止位
    MSComm1.PortOpen = True '打开通信口COM1---需要连接RS485
    Text1 = ""
End Sub

Private Sub Command1_Click()
    '手动发送键
    Dim DatTempBuf(30) As Byte '发送字节长31
    Dim OutDatV As Variant
    MSComm1.OutBufferCount = 0 '清除发送缓冲区
    MSComm1.OutBufferCount = 0  '清除发送缓冲区MSComm1.OutBufferCount = 0
    If MSComm1.PortOpen = False Then
        MsgBox "串口未打开", 52, "提示"
        Exit Sub
    End If
    DatTempBuf(0) = &HFF
    DatTempBuf(1) = &H55
    DatTempBuf(2) = &HAA
    DatTempBuf(3) = &H4
    DatTempBuf(4) = &H0
    DatTempBuf(5) = &H3
    DatTempBuf(6) = &H7
    MSComm1.Output = DatTempBuf
    MSComm1.InBufferCount = 0 '清除接收缓冲区
    MSComm1.RThreshold = 1 '所要接收的数据长度
End Sub

Private Sub MSComm1_OnComm() '接收数据
    Dim strBuff As String
    Dim i As Integer
    Select Case MSComm1.CommEvent
        Case 2
            MSComm1.InputLen = 0
            strBuff = MSComm1.Input
            BytReceived() = strBuff
            For i = 0 To UBound(BytReceived) '接收数据处理为16进制
                If Len(Hex(BytReceived(i))) = 1 Then
                    strData = strData & "0" & Hex(BytReceived(i))
                Else
                    strData = strData & Hex(BytReceived(i))


                End If
            Next
            If Len(strData) = 60 Then
                Text1 = strData '数据处理--处理后进入对应的数据库
                strData = ""
            End If
    End Select
End Sub
[最优解释]


ption Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim strData As String
Private Sub Form_Load()
  MSComm1.CommPort = 1          '利用串口COM1进行通讯
  MSComm1.InputLen = 1          '每次读取接收缓冲区的1个字节
  MSComm1.OutBufferSize = 512   '设置发送缓冲区为512字节
  MSComm1.InBufferSize = 512    '设置接收缓冲区为512字节
  MSComm1.OutBufferCount = 0    '清除发送缓冲区
  MSComm1.InBufferCount = 0     '清除接收缓冲区
  MSComm1.InputMode = comInputModeBinary    '数据传输设置为二进制格式
  MSComm1.RThreshold = 1        '每接收一个字符就触发一次OnComm事件
  MSComm1.Settings = "2400,N,8,1"           '设置波特率、校验位(1)、数据位、停止位
  If Not MSComm1.PortOpen Then MSComm1.PortOpen = True        '打开通信口COM1---需要连接RS485
  Text1.Text = ""
End Sub

Private Sub Command1_Click()
    Dim DatTempBuf(0 To 2) As Byte
    Dim OutDatV As Variant
On Error GoTo errSub
    If Not MSComm1.PortOpen Then MSComm1.PortOpen = True
'    DatTempBuf(0) = &HFF
'    DatTempBuf(1) = &H55
'    DatTempBuf(2) = &HAA
'    DatTempBuf(3) = &H4
'    DatTempBuf(4) = &H0
'    DatTempBuf(5) = &H3
'    DatTempBuf(6) = &H7
    DatTempBuf(0) = &H68
    DatTempBuf(1) = &HF
    DatTempBuf(2) = &H43
    MSComm1.Output = DatTempBuf
    Exit Sub
errSub:

End Sub

Private Sub MSComm1_OnComm() '接收数据
  Dim strBuff As String
  Dim i As Integer
  Dim varInput As Variant
On Error GoTo errSub
  Select Case MSComm1.CommEvent
    Case 2
        strData = ""
        MSComm1.RThreshold = 0          '屏蔽掉OnComm事件的触发
        Sleep 20                        '等待20ms,以便数据完全上传


        Do
            If Not IsNull(varInput) Then varInput = Null
            varInput = MSComm1.Input    '每次读取一个数据
            If Not IsNull(varInput) Then
                strData = strData & Right("00" & Hex("00" & varInput(0)), 2) & " "
            End If
        Loop Until MSComm1.InBufferCount = 0
        Text1.Text = strData
        MSComm1.RThreshold = 1
  End Select
  Exit Sub
errSub:

End Sub
 
 



[其他解释]
Modbus 协议是基于时间来分割数据帧的,所以VB 实现起来有问题。
[其他解释]

Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim strData As String
Private Sub Form_Load()
  MSComm1.CommPort = 1          '利用串口COM1进行通讯
  MSComm1.InputLen = 1          '每次读取接收缓冲区的1个字节
  MSComm1.OutBufferSize = 512   '设置发送缓冲区为512字节
  MSComm1.InBufferSize = 512    '设置接收缓冲区为512字节
  MSComm1.OutBufferCount = 0    '清除发送缓冲区
  MSComm1.InBufferCount = 0     '清除接收缓冲区
  MSComm1.InputMode = comInputModeBinary    '数据传输设置为二进制格式
  MSComm1.RThreshold = 1        '每接收一个字符就触发一次OnComm事件
  MSComm1.Settings = "2400,N,8,1"           '设置波特率、校验位(1)、数据位、停止位
  If Not MSComm1.PortOpen Then MSComm1.PortOpen = True        '打开通信口COM1---需要连接RS485
  Text1.Text = ""
End Sub

Private Sub Command1_Click()
    Dim DatTempBuf(0 To 6) As Byte
    Dim OutDatV As Variant
On Error GoTo errSub
    If Not MSComm1.PortOpen Then MSComm1.PortOpen = True
    DatTempBuf(0) = &HFF
    DatTempBuf(1) = &H55
    DatTempBuf(2) = &HAA
    DatTempBuf(3) = &H4
    DatTempBuf(4) = &H0
    DatTempBuf(5) = &H3
    DatTempBuf(6) = &H7
    MSComm1.Output = DatTempBuf
    Exit Sub
errSub:

End Sub

Private Sub MSComm1_OnComm() '接收数据
  Dim strBuff As String
  Dim i As Integer


  Dim varInput As Variant
On Error GoTo errSub
  Select Case MSComm1.CommEvent
    Case 2
        strData = ""
        MSComm1.RThreshold = 0          '屏蔽掉OnComm事件的触发
        Sleep 20                        '等待20ms,以便数据完全上传
        Do
            If Not IsNull(varInput) Then varInput = Null
            varInput = MSComm1.Input    '每次读取一个数据
            If Not IsNull(varInput) Then
                strData = strData & Right("00" & Hex("00" & varInput(0)), 2) & " "
            End If
        Loop Until MSComm1.InBufferCount = 0
        Text1.Text = strData
        MSComm1.RThreshold = 1
  End Select
  Exit Sub
errSub:

End Sub
 
 



[其他解释]
引用:
Modbus 协议是基于时间来分割数据帧的,所以VB 实现起来有问题。

你好 那有没有什么方法可以实现我设想的

利用timer控件 以一定频率发送我所固定好的指令(形如:68 0F 04 44 ) 485及硬件端的反馈设计都是别人调试好的 
[其他解释]
Veron_04

谢谢 我先去测试下您修改的代码。
[其他解释]
DatTempBuf参数中 我希望传输的是 "68 0F 43" 这样类似的指令 而代码中是 &HFF &HAA 这样的 我不明白怎么进行转换 如果传输的指令不是指定的 "68 0F 43"这样的话 485那边的硬件是不会给反馈的。
[其他解释]
前提是你的68和43必须是16进制数据
[其他解释]
好的 我明白了 其实DatTempBuf赋值的时候 &H + 16进制 就是一种表达 多谢多谢 我去修改测试下先。
[其他解释]
怎样给分啊 问题解决了 非常感谢
[其他解释]
.......
会发帖,不会结贴?左下有个红色按钮,赫然写着:结贴
[其他解释]
再次感谢 总算会结贴给分了
[其他解释]
受教了!

热点排行