| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6420 人关注过本帖
标题:求助~!!!如何用VB6.0实现串口通信。要求十六进制发送,十六进制接收~!! ...
只看楼主 加入收藏
zlj770880
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-5-28
结帖率:0
收藏
已结贴  问题点数:20 回复次数:5 
求助~!!!如何用VB6.0实现串口通信。要求十六进制发送,十六进制接收~!!谢谢高手们~!!!
'**********************************
'字符表示的十六进制数转化为相应的整数
'错误则返回  -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
以十六进制编码方式进行发送时候,发送的应该是二进制数据流,从textsend文本框中得到的只是String,应该将其转换为Byte Arrey。作为十六进制数,其中应该只包括0~9这10个数字以及A~F,或者a~f这6个字母,为了增强可读性,我们允许其中插入空格,其他的字符则应该视为非法字符。我们约定,从头开始,每两个有效的字符作为一个字节的内容,如果有效字符的总数是奇数,则忽略最后一个单独的字符,若遇到非法字符,则对其后面的字符均不作处理。
上面的函数是实现这两个功能的。
本人想设置2个按钮,其中一个发送,一个接受,都采取十六进制编码方式,但是不知道如何将以上的函数运用进去,求高人指点~!!!本人新手,全班积分送上。
实现的功能非常简单,就希望能够发送和接受十六进制编码方式的字符串,谢谢~!!!!!!!
搜索更多相关主题的帖子: 串口 十六进制 通信 
2010-05-28 13:44
zlj770880
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-5-28
收藏
得分:0 
有没有高手回答啊,在线等待。。。。。。。。。。。。。。。
2010-05-28 13:50
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4943
专家分:30067
注 册:2008-10-15
收藏
得分:20 
1\数据均使用 Byte Arrey 或 Byte
2\你转换程序里,不能限制只转换1位.因为 一个字节 转换为 16 进制时,是 2位 .如 &H1F 这种的.
3\

程序代码:
Function ConvertHexChr(str As String) As Byte
Dim t As String
If Len(str) <= 2 Then       ' 1位或2位
    t = "&H" & str
    If IsNumeric(t) Then
        ConvertHexChr = CByte(t)
    Else
        ConvertHexChr = 0          'byte 类型取值范围为 0-255 ,不能为-1
    End If
Else
    ConvertHexChr = 0              'byte 类型取值范围为 0-255 ,不能为-1
End If
End Function

Function strHexToByteArray(strText As String, bytByte() As Byte) As Integer
'二位16进制转化为 BYTE 数组
Dim j As String
Dim i As Long
Dim o As Long

j = Replace(strText, " ", "")       '去掉空格
i = Len(j)

If i And 1 = 1 Then         '奇数
    j = Left(j, i - 1) & "0" & Mid(j, i, 1)     '少一位,最后一个数补一位
    i = i + 1
End If
strHexToByteArray = i / 2
ReDim bytByte(strHexToByteArray)

For o = 1 To strHexToByteArray
    bytByte(o) = ConvertHexChr(Mid(j, o * 2 - 1, 2))
Next o

End Function

授人于鱼,不如授人于渔
早已停用QQ了
2010-05-28 15:17
zlj770880
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-5-28
收藏
得分:0 
额,我不是问这段程序是不是对,我是问如何将这段程序运用到编程中,因为我想要实现比如“E1 02 00 00 00 01 00 00 00 02 00 00 00 00 00 EA”这样的十六进制字符串的串口通信
2010-05-28 16:48
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4943
专家分:30067
注 册:2008-10-15
收藏
得分:0 
把这个字串转为 byte 数组后,再发送.

我没看你的转换程序.......

没用过 串口 程序来了.

你自己看一下例子吧.
----------------------------------------------------------
'这个例子中,是读到指定的字符就结束,否则就循环
Private Sub Form_Load ()
   ' 保存输入子串的缓冲区
   Dim Instring As String
   ' 使用 COM1。
    = 1
   ' 9600 波特,无奇偶校验,8 位数据,一个停止位。
   MSComm1.Settings = "9600,N,8,1"
   ' 当输入占用时,
   ' 告诉控件读入整个缓冲区。
   MSComm1.InputLen = 0
   ' 打开端口。
   MSComm1.PortOpen = True
   ' 将 attention 命令送到调制解调器。
   MSComm1.Output = "ATV1Q0" & Chr$(13) ' 确保
   ' 调制解调器以"OK"响应。
   ' 等待数据返回到串行端口。
   Do
      DoEvents
   Buffer$ = Buffer$ & MSComm1.Input
   Loop Until InStr(Buffer$, "OK" & vbCRLF)
   ' 从串行端口读 "OK" 响应。

   ' 关闭串行端口。
   MSComm1.PortOpen = False
End Sub

---------------------------------------------------------
'这个例子中,当 com 口有事件发生时去操作
OnComm 事件示例
下例说明如何处理通讯错误和事件。可以在相关的 Case 语句之后插入代码来处理特定的错误或事件。

Private Sub MSComm_OnComm ()
   Select Case
   ' Handle each event or error by placing
   ' code below each case statement

' 错误
      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



授人于鱼,不如授人于渔
早已停用QQ了
2010-05-28 18:54
comliangyan
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2011-7-5
收藏
得分:0 
学习下,
2011-07-07 12:39
快速回复:求助~!!!如何用VB6.0实现串口通信。要求十六进制发送,十六进制接收 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017605 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved