我想做一个串口的软件,现在我想把16进制的0x11,0x22,0xf9,0x55....这样的16进制数有3800个,要变成1122f955.....发送,实在想不出用什么方法了,帮帮我把

解决方案 »

  1.   

    从你的要求来看,并没有进行进制转换,那么直接转换成字符串就可以了啊,如CStr(&h11) & CStr(&h22)...。
      

  2.   


    Private Sub Command1_Click()
        Dim hexSj() As String
        Dim hexBin() As Byte
        Dim hexStr As String
        Dim sj As String
        sj = "0x11,0x22,0xf9,0x55,0xf2,0x6f,0x75"
        hexSj = Split(sj, ",")
        Dim i As Integer
        ReDim hexBin(UBound(hexSj))
        For i = 0 To UBound(hexSj)
            hexBin(i) = "&H" & Mid(hexSj(i), 3, 2)
        Next
        MSComm1.output = hexBin
    End SubPrivate Sub Form_Load()
        MSComm1.Settings = "9600,N,8,1"
        MSComm1.PortOpen = True
    End SubEnd Sub
      

  3.   

    感谢zdingyun  不过我发了4000个数据,为什么接收到的数据都比4000少呢...中间的数据怎么会丢失了呀...奇怪!改怎么办啊 ?????
      

  4.   

    发送需控制发送节奏,在http://topic.csdn.net/u/20081016/09/406ea6d4-66b8-4c25-8a70-1488a4a62aa2.html链接有我的控制发送节奏代码可参考。其中yTemp()字节数组相当于我上述代码中的hexBin()字节数组,整合两处代码,就能发送不丢失字节。
      

  5.   


    1. 转换后发送字符串的方法:
       优点:如果对方需要字符格式,则不需要对方转换格式。
       缺点:发送字符串,发送时VB要做UNICODE到ANSI转换,如果接收方是VB则要做ANSI到UNICODE的转换,浪费时间。
       
       如果采用方法1: 一个一个字节地循环是不可避免的,但是在VB里转换非常慢,因为用到字符函数,比如Hex等,
       想想,3800个字符要调用3800次函数,出入栈3800次,极大的浪费。
       如果用C或者什么的写一个DLL,传递字节数组进去,返回经转换的字节数组(其实是等效的字符),利用C高效
       的指针直接操作内存,效率很高,3800个字节不算什么!!!   怎么转换? 比如:0X11,则在目标数组写入0X31,0X31两字节。
       
       楼主的1122f955.....是指字符串吧?2. 发送字节,让对方转换
       优点:发送速度快。
       缺点:如果格式不对,则要对方转换格式。
       
    建议: 除非对方一定要字符或者是少量字符,要不永远不要在VB发送字符!   
      

  6.   

    建议看一下MSComm的帮助,非常有用,vb6安装盘本身就有一个例子!
      

  7.   

    LZ的问贴中未提及波特率,我的代码基于MSCOMM控件的缺省设置考虑.
    关于LZ在6楼说发了4000个数据,为什么接收到的数据都比4000少呢...中间的数据怎么会丢失了呀...奇怪!改怎么办啊 ?????,可详细参阅http://topic.csdn.net/u/20071114/16/de3ade11-509e-43eb-a638-0dac7bcef821.html链接的讨论.
      

  8.   

    zdingyun 你能贴出详细程序吗?我试了下还是不行..有可能是我整合错误
    我现在想做的就是把
    0xF6,0x75,0xEF,0x7F,0xF5,0xFE,0xFA,0xF5,0xF5,0xFF,0xD5,0x81,0xBD,0xB6,0xDF,0x00,
    0x3F,0xBD,0xFF,0x5D,0xFD,0x7F,0xFB,0xFF,0xFB,0xFF,0xFB,0x7F,0xF6,0xFF,0xED,0xFF,
    0xFF,0x6F,0x5E,0xFF,0xEF,0xBF,0x3B,0xAE,0xF6,0xF5,0xEF,0x7F,0xF5,0xFE,0xF0,0x75,
    ...
    ...
    ...
    (!注意它16个数为一行)这样3800个数据通过无线模块串口发送到另外一台电脑,另一台接收到的是
    fe 75 ef 7f.......(“0x”  和  “,” 都没了)
    最重要的是保证正确性.朋友们快来谈论下!
      

  9.   


    楼主的通信模式是这样吗: PC1 -> 无线模块1 -----> 无线模块2 -> PC2  ?
    要注意:
    1. 按无线模块说明书来设置协议,正规的说明书应该说明要注意什么问题的,
    (工作在免费频段的小功率模块受干扰比较大,所以无线波特率不能太高)
    2.PC与无线的波特率要比无线与无线的相等或小些
    3.如果用USB转串口之类的设备,要留心此类设备可能有缺陷(经常断开连接或者数据量大的时候校验错等等)。zdingyun的例子已经很清楚了,稍改动即可(不会改动?),可能是你需求不是很明确,或者是基础知识欠缺些。
    单单靠奇偶校验还不能保证正确性,用CRC校验能保证正确性。
      

  10.   

    LZ:请将
    0xF6,0x75,0xEF,0x7F,0xF5,0xFE,0xFA,0xF5,0xF5,0xFF,0xD5,0x81,0xBD,0xB6,0xDF,0x00, 
    0x3F,0xBD,0xFF,0x5D,0xFD,0x7F,0xFB,0xFF,0xFB,0xFF,0xFB,0x7F,0xF6,0xFF,0xED,0xFF, 
    0xFF,0x6F,0x5E,0xFF,0xEF,0xBF,0x3B,0xAE,0xF6,0xF5,0xEF,0x7F,0xF5,0xFE,0xF0,0x75, 

    原始文件发EMAIL
    [email protected]
    以便分析作出代码。
      

  11.   

    Option Explicit
        Dim strData As String
        Dim bytInput() As Byte
        Dim dataSend() As Byte
        Dim yTemp() As Byte
        Dim SJ() As Byte
        Dim i As Long
        Dim Ulen  As Long
        Dim Llen  As Long
        Dim for_Sum  As Long
        Dim Yu_sum As Integer
        Dim strfFleName As String
    Private Sub cmdOpen_Click()
        Dim str1 As String
        Dim NextLine As String
        Dim Txt_sj As String
        Dim l As Integer
        Dim yTemp() As Byte
        CommonDialog1.ShowOpen
        Text1 = ""
        strfFleName = CommonDialog1.FileName
        Text7 = Timer
        Text7.Refresh
        Open strfFleName For Input As #1
            Do While Not EOF(1)
                Input #1, str1
                strData = strData & Right(str1, 2) '& Chr(13) & Chr(10)
                Text1 = strData
            Loop
        Close
        ReDim yTemp(Len(strData) / 2 - 1)
        Dim i As Integer
        For i = 1 To Len(strData) Step 2
            yTemp((i - 1) / 2) = "&H" & Mid(strData, i, 2)
        Next
        Ulen = UBound(yTemp)
        Llen = LBound(yTemp)
        Yu_sum = (Ulen + 1) Mod 256
        for_Sum = (Ulen + 1) \ 256
        Print "字节长= "; Ulen + 1; "循环次数= "; for_Sum; "余数= "; Yu_sum
        ReDim SJ(Ulen)
        For i = 0 To Ulen
        SJ(i) = yTemp(i)
        Next
        If for_Sum > 0 Then
           Timer1.Enabled = True
           Text2 = Timer
           Text2.Refresh
        ElseIf for_Sum = 0 Then
            Cmd_Dsend
        End If
    End SubPrivate Sub Form_Load()
        MSComm1.CommPort = 1
        MSComm1.InBufferSize = 1024
        MSComm1.OutBufferSize = 1024
        MSComm1.Settings = "9600,n,8,1"
        MSComm1.PortOpen = True
        Text1 = ""
        Text2 = ""
        Text3 = ""
        Text4 = ""
        Timer1.Enabled = False
        Timer1.Interval = 10
    End Sub
    Private Sub Timer1_Timer() '大数据包分解为多个小数据包
        Static sum As Long
        Dim i As Integer
        ReDim dataSend(255) As Byte
        For i = 0 To 255
            If sum >= for_Sum Then
                Exit For
            End If
            dataSend(i) = SJ(i + sum * 256)
        Next
        MSComm1.Output = dataSend
        sum = sum + 1
        If sum >= for_Sum Then
            Cmd_Fsend '发送剩余字节
            Text3 = Timer
            Text3.Refresh
            Timer1.Enabled = False
        End If
    End Sub
    Private Sub Cmd_Dsend()
        ReDim dataSend(Yu_sum - 1)
        For i = 0 To Yu_sum - 1
            dataSend(i) = yTemp(i)
        Next
        MSComm1.Output = dataSend
    End Sub
    Private Sub Cmd_Fsend()
            Text4 = Timer
            Text4.Refresh
        If Yu_sum > 0 Then
            ReDim dataSend(Yu_sum - 1)
            For i = 0 To Yu_sum - 1
                dataSend(i) = SJ(256 * for_Sum + i)
            Next
            MSComm1.Output = dataSend
        End If
        Text5 = Timer
        Text5.Refresh
    End Sub
      

  12.   

    修正错误:
    Private Sub cmdOpen_Click()
        Dim str1 As String
        Dim NextLine As String
        Dim Txt_sj As String
        Dim l As Integer
        Dim yTemp() As Byte
        CommonDialog1.ShowOpen
        Text1 = ""
        strfFleName = CommonDialog1.FileName
        Text7 = Timer
        Text7.Refresh
        Open strfFleName For Input As #1
            Do While Not EOF(1)
                Input #1, str1
                strData = strData & Right(str1, 2) '& Chr(13) & Chr(10)
            Loop
        Close
        Text1 = strData
        ReDim yTemp(Len(strData) / 2 - 1)
        Dim i As Integer
        For i = 1 To Len(strData) Step 2
            yTemp((i - 1) / 2) = "&H" & Mid(strData, i, 2)
        Next
        Ulen = UBound(yTemp)
        Llen = LBound(yTemp)
        Yu_sum = (Ulen + 1) Mod 256
        for_Sum = (Ulen + 1) \ 256
        Print "字节长= "; Ulen + 1; "循环次数= "; for_Sum; "余数= "; Yu_sum
        ReDim SJ(Ulen)
        For i = 0 To Ulen
        SJ(i) = yTemp(i)
        Next
        If for_Sum > 0 Then
           Timer1.Enabled = True
           Text2 = Timer
           Text2.Refresh
        ElseIf for_Sum = 0 Then
            Cmd_Dsend
        End If
    End Sub
      

  13.   

    zc511624 发表于:2008-11-05
    回复:
    Timer 函数 
    返回一个 Single,代表从午夜开始到现在经过的秒数。 
    语法 
    Timer 
    说明 
    Microsoft Windows中,Timer函数返回一秒的小数部分。 
    imer 函数示例 
    本示例使用 Timer 函数来暂停应用程序。同时用 DoEvents 在暂停期间将控制让给其他进程。 Dim PauseTime, Start, Finish, TotalTime 
    If (MsgBox("Press Yes to pause for 5 seconds", 4)) = vbYes Then 
    PauseTime = 5 ' 设置暂停时间。 
    Start = Timer ' 设置开始暂停的时刻。 
    Do While Timer < Start + PauseTime 
    DoEvents ' 将控制让给其他程序。 
    Loop 
    Finish = Timer ' 设置结束时刻。 
    TotalTime = Finish - Start ' 计算总时间。 
    MsgBox "Paused for " & TotalTime & " seconds" 
    Else 
    End 
    End If 
      

  14.   

    Option Explicit
        Dim bytInput() As Byte
        Dim dataSend() As Byte
        Dim SJ() As Byte
        Dim i As Long
        Dim strfFleName As String
    Private Sub cmdOpen_Click()
        Dim for_Sum  As Long
        Dim Yu_sum As Integer
        Dim Ulen  As Long
        Dim Llen  As Long
        Dim strData As String
        Dim NextLine As String
        Dim yTemp() As Byte
        CommonDialog1.ShowOpen
        Text1 = ""
        strfFleName = CommonDialog1.FileName
        Text7 = Timer
        Text7.Refresh
        Open strfFleName For Input As #1
            Do While Not EOF(1)
                Input #1, str1
                strData = strData & Right(str1, 2) '& Chr(13) & Chr(10)
            Loop
        Close
        Text1 = strData
        ReDim yTemp(Len(strData) / 2 - 1)
        Dim i As Integer
        For i = 1 To Len(strData) Step 2
            yTemp((i - 1) / 2) = "&H" & Mid(strData, i, 2)
        Next
        Ulen = UBound(yTemp)
        Llen = LBound(yTemp)
        Yu_sum = (Ulen + 1) Mod 256
        for_Sum = (Ulen + 1) \ 256
        Print "字节长= "; Ulen + 1; "循环次数= "; for_Sum; "余数= "; Yu_sum
        ReDim SJ(Ulen)
        For i = 0 To Ulen
        SJ(i) = yTemp(i)
        Next
        If for_Sum > 0 Then
           Timer1.Enabled = True
           Text2 = Timer
           Text2.Refresh
        ElseIf for_Sum = 0 Then
            Cmd_Dsend
        End If
    End SubPrivate Sub Form_Load()
        MSComm1.CommPort = 1
        MSComm1.InBufferSize = 1024
        MSComm1.OutBufferSize = 1024
        MSComm1.Settings = "9600,n,8,1"
        MSComm1.PortOpen = True
        Text1 = ""
        Text2 = ""
        Text3 = ""
        Text4 = ""
        Timer1.Enabled = False
        Timer1.Interval = 10
    End Sub
    Private Sub Timer1_Timer() '大数据包分解为多个小数据包
        Static sum As Long
        Dim i As Integer
        ReDim dataSend(255) As Byte
        For i = 0 To 255
            If sum >= for_Sum Then
                Exit For
            End If
            dataSend(i) = SJ(i + sum * 256)
        Next
        MSComm1.Output = dataSend
        sum = sum + 1
        If sum >= for_Sum Then
            Cmd_Fsend '发送剩余字节
            Text3 = Timer
            Text3.Refresh
            Timer1.Enabled = False
        End If
    End Sub
    Private Sub Cmd_Dsend()
        ReDim dataSend(Yu_sum - 1)
        For i = 0 To Yu_sum - 1
            dataSend(i) = yTemp(i)
        Next
        MSComm1.Output = dataSend
    End Sub
    Private Sub Cmd_Fsend()
            Text4 = Timer
            Text4.Refresh
        If Yu_sum > 0 Then
            ReDim dataSend(Yu_sum - 1)
            For i = 0 To Yu_sum - 1
                dataSend(i) = SJ(256 * for_Sum + i)
            Next
            MSComm1.Output = dataSend
        End If
        Text5 = Timer
        Text5.Refresh
    End Sub