VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2446|回复: 11

关于串口调试精灵与VB6的问题

[复制链接]

1

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-2-20 19:30:02 | 显示全部楼层 |阅读模式




串口设置:
强制M100 –OFF:02  30 30 37 31 30 34 36 34 03 39 39
强制M100-ON:  02  30 30 37 30 30 34 36 34 03 39 38

所应该注意的是:命令后不可加H且应点选串口调试精灵“十六进制发送”

此上是我用串口调试精灵发送命令到PLC(可编程控制器)的命令格式;
并调试成功。

后来我用VB6的MSCOMM控件做上位机,用MSCOMM发送,不知何故,调试不了。

VB程序如下:其他参数都设定正确。

mscomm1.output="02  30 30 37 31 30 34 36 34 03 39 39"

mscomm1.output="02&H  30&H 30&H 37&H 31&H 30&H 34&H 36&H 34&H 03&H 39&H 39&H"

请问各位高手,串口调试精灵中的16进制发送,用MSCOMM.OUTPUT如何写?












PLC-VB调试程序:




回复

使用道具 举报

0

主题

2

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-4 22:45:01 | 显示全部楼层
一般这类工具的“十六进制发送”方式都是把普通字符串十六进制数据(如12 34)分字节按高低位转化为十进制的数据(如18 52)然后到一个byte数组里再进行发送的。。。
例子在网上很多。。。
回复

使用道具 举报

0

主题

2

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-31 10:15:01 | 显示全部楼层
Public Function SendHexDataString() As Boolean
    Dim SendData As String
    Dim buf() As Byte
    Dim m, n, p As Long
    Dim i, j, k As Long, cs
   
    On Error Resume Next

    SendHexDataString = False
    SendData = "029c"
   
    'SendData = strSendData      'Trim(Text2.Text)  '½«Òª•¢Ë͵ÄÎı¾¿òÄڵĿոñÈ¥³ý£¬²¢ÇÒ¸³¸øSENDDATA
    If frmMain.MSComm1.PortOpen = False Then
        frmMain.MSComm1.PortOpen = True
        'MsgBox "Çë´ò¿ª´®¿Ú", vbOKOnly, "´íÎó"
        'Exit Function
    End If


    If Len(SendData) = 0 Then  'Èç¹ûÎı¾¿òÄÚûÓÐÊý¾Ý
        MsgBox "ÇëÊäÈëÊý¾Ý", vbOKOnly, "´íÎó"
        Exit Function
    End If


    'If Check2.Value = 0 Then  'Èç¹ûûÓÐÑ¡ÔñÊÇ•ñÒÔ16½øÖÆ•¢ËÍ
        'p = Len(SendData)
        'ReDim buf(p - 1) As Byte
        'For i = 1 To p
        '    buf(i - 1) = Asc(Mid(SendData, i, 1)) '½«Ã¿¸ö×Ö•ûÒÔASCÂë•¢ËÍ
        'Next i
    'Else    'Èç¹ûÑ¡ÔñÒÔ16½øÖÆ•¢ËÍ
        SendData = Replace(SendData, " ", "")
        SendData = Replace(SendData, vbCrLf, "")
        p = Len(SendData) \ 2 - 1
        ReDim buf(p) As Byte
        For i = 0 To p
            buf(i) = CLng("&H" & Mid(SendData, i * 2 + 1, 2)) 'ÒÔ16½øÖÆÊý•¢ËÍ
        Next i
    'End If

    'ͨ¹ý´®¿Ú•¢ËÍÊý¾Ý
    frmMain.MSComm1.InputMode = comInputModeBinary
    frmMain.MSComm1.Output = buf()
   
    'Sleep (100)
    'ProcGetData
   
    SendHexDataString = True
   
    Exit Function

'³ö´í´¦Àí
DoErr:
    If Err.Number = 13 Then
        MsgBox "Êý¾Ý¸ñʽ²»¶Ô", vbOKOnly, "´íÎó"
    Else
        MsgBox Err.Description
    End If
End Function
回复

使用道具 举报

0

主题

2

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-31 10:30:01 | 显示全部楼层
乱码是中文注释,不影响的
第1种是发送ASCII,第2种是发送Hex
回复

使用道具 举报

0

主题

2

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-8-9 22:45:01 | 显示全部楼层
'**********************************
'字符表示的十六进制数转化为相应的整数
'错误则返回  -1
'**********************************

Function ConvertHexChr(str As String) As Integer
   
    Dim test As Integer
   
    test = Asc(str)
    If test >= Asc("0") And test <= Asc("9") Then
        test = test - Asc("0")
    ElseIf test >= Asc("a") And test <= Asc("f") Then
        test = test - Asc("a") + 10
    ElseIf test >= Asc("A") And test <= Asc("F") Then
        test = test - Asc("A") + 10
    Else
        test = -1                                       '出错信息
    End If
    ConvertHexChr = test
   
End Function


'**********************************
'字符串表示的十六进制数据转化为相应的字节串
'返回转化后的字节数
'**********************************

Function strHexToByteArray(strText As String, bytByte() As Byte) As Integer
   
    Dim HexData As Integer          '十六进制(二进制)数据字节对应值
    Dim hstr As String * 1          '高位字符
    Dim lstr As String * 1          '低位字符
    Dim HighHexData As Integer      '高位数值
    Dim LowHexData As Integer       '低位数值
    Dim HexDataLen As Integer       '字节数
    Dim StringLen As Integer        '字符串长度
    Dim Account As Integer          '计数
        
    strTestn = ""                   '设初值
    HexDataLen = 0
    strHexToByteArray = 0
   
    StringLen = Len(strText)
    Account = StringLen \ 2
    ReDim bytByte(Account)
   
    For n = 1 To StringLen
   
        Do                                              '清除空格
            hstr = Mid(strText, n, 1)
            n = n + 1
            If (n - 1) > StringLen Then
                HexDataLen = HexDataLen - 1
               
                Exit For
            End If
        Loop While hstr = " "
        
        Do
            lstr = Mid(strText, n, 1)
            n = n + 1
            If (n - 1) > StringLen Then
                HexDataLen = HexDataLen - 1
               
                Exit For
            End If
        Loop While lstr = " "
        n = n - 1
        If n > StringLen Then
            HexDataLen = HexDataLen - 1
            Exit For
        End If
        
        HighHexData = ConvertHexChr(hstr)
        LowHexData = ConvertHexChr(lstr)
        
        If HighHexData = -1 Or LowHexData = -1 Then     '遇到非法字符中断转化
            HexDataLen = HexDataLen - 1
            
            Exit For
        Else
            
            HexData = HighHexData * 16 + LowHexData
            bytByte(HexDataLen) = HexData
            HexDataLen = HexDataLen + 1
            
            
        End If
                        
    Next n
   
    If HexDataLen > 0 Then                              '修正最后一次循环改变的数值
        HexDataLen = HexDataLen - 1
        ReDim Preserve bytByte(HexDataLen)
    Else
        ReDim Preserve bytByte(0)
    End If
   
   
    If StringLen = 0 Then                               '如果是空串,则不会进入循环体
        strHexToByteArray = 0
    Else
        strHexToByteArray = HexDataLen + 1
    End If
   
   
End Function
回复

使用道具 举报

0

主题

2

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-8-9 23:00:01 | 显示全部楼层
把十六进制转换后发送
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-8-10 13:00:01 | 显示全部楼层
用byte数组就行了,不用搞很复杂。
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-8-13 07:00:01 | 显示全部楼层
Form1.MSComm1.Settings = "9600,n,8,1"

  aa(0) = 2
  aa(1) = 1
  xordata = 0 Xor aa(1)
  aa(2) = change(Text1.Text)
  xordata = xordata Xor aa(2)
  aa(3) = change(Text2(0).Text)
  xordata = xordata Xor aa(3)
  aa(4) = change(Text2(1).Text)
  xordata = xordata Xor aa(4)
  aa(5) = change(Text2(2).Text)
  xordata = xordata Xor aa(5)
  aa(6) = change(Text3(0).Text)
  xordata = xordata Xor aa(6)
  aa(7) = change(Text3(1).Text)
  xordata = xordata Xor aa(7)
  aa(8) = change(Text3(2).Text)
  
  xordata = xordata Xor aa(8)
  
  
  aa(9) = change(Text3(3).Text)
  xordata = xordata Xor aa(9)
  aa(10) = 3
  xordata = xordata Xor aa(10)
  aa(11) = xordata
  aa(12) = 14
  
  

  
  Form1.MSComm1.InputMode = 0
  Form1.MSComm1.Output = aa
以十六进制发送,上述代码中的aa中的元素换成你所要发的数据即可
回复

使用道具 举报

1

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-8-13 19:45:01 | 显示全部楼层
太感动了  看到这么多人的帮助 我也贴个  后来解决了

Private Sub Command1_Click()

Dim bdata(1 To 12) As Byte
bdata(1) = &H2
bdata(2) = &H30
bdata(3) = &H30
bdata(4) = &H37
bdata(5) = &H31
bdata(6) = &H30
bdata(7) = &H34
bdata(8) = &H36
bdata(9) = &H34
bdata(10) = &H3
bdata(11) = &H39
bdata(12) = &H39
MSComm1.Output = bdata
End Sub


Private Sub Command2_Click()
Dim bdata(1 To 12) As Byte
bdata(1) = &H2
bdata(2) = &H30
bdata(3) = &H30
bdata(4) = &H37
bdata(5) = &H30
bdata(6) = &H30
bdata(7) = &H34
bdata(8) = &H36
bdata(9) = &H34
bdata(10) = &H3
bdata(11) = &H39
bdata(12) = &H38

MSComm1.Output = bdata
End Sub

Private Sub Command3_Click()
Unload Me
End Sub

Private Sub Form_Load()
MSComm1.PortOpen = True

End Sub



测试过   可以的
回复

使用道具 举报

1

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-8-13 20:00:02 | 显示全部楼层
再次谢谢 大家 我是做工业自动化的PLC 组态 计算机是我的第2专业
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表