VB中,用MSCOMM控件如何实现PC一次传2个字节给单片机?谢谢!

解决方案 »

  1.   


    Private Sub cmdSend_Click()
        Dim sj() As Byte
        Dim sj_txt As String
        Dim i As Integer
        sj_txt = "00FF" '发送16进制两字节数据
        Text1 = sj_txt
        ReDim sj(Len(sj_txt) / 2 - 1)
        For i = 0 To Len(sj_txt) - 1 Step 2
           sj(i / 2) = Val("&H" & Mid(sj_txt, i + 1, 2))
        Next
           MSComm1.Output = sj
    End SubPrivate Sub Form_Load()
        Dim port As Integer
        port = 1
        MSComm1.CommPort = port                   'COM端口
        MSComm1.Settings = "9600,n,8,1"
        MSComm1.InputMode = comInputModeBinary      '采用二进制传输
        MSComm1.InBufferCount = 0   '清空接受缓冲区
        MSComm1.OutBufferCount = 0  '清空传输缓冲区
        MSComm1.RThreshold = 1      '产生MSComm事件
        MSComm1.InBufferSize = 1024
        MSComm1.PortOpen = True
    End Sub
      

  2.   

    2个字节的话  直接发送 integer 类型的数据也可以
    dim s as string,data2 as integer
    s="10FF"  '假设要发送数据10FF 注意这里 低位是 FF 也就是先会发送FF后10
    data2=val(s)
    MSComm1.Output = data2
      

  3.   

    data2=val(s) 
    ==>
    data2=val("&H" & s) 
      

  4.   

    To:ayalicer
    你的代码在VB运行出错,应使用API函数实现:Option Explicit
        Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    Private Sub Command2_Click() '发送Integer类型数据
        Dim s As String
        Dim Data2 As Integer
        Dim Buffer(1) As Byte
        s = "10FF"   '假设要发送数据10FF,注意这里低位是FF,也就是先会发送FF后发10
        Data2 = Val("&H" & s)
        CopyMemory Buffer(0), Data2, 2
        MSComm1.Output = Buffer
    End SubPrivate Sub Form_Load()
        Dim port As Integer
        port = 1
        MSComm1.CommPort = port                   'COM端口
        MSComm1.Settings = "9600,n,8,1"
        MSComm1.InputMode = comInputModeBinary      '采用二进制传输
        MSComm1.InBufferCount = 0   '清空接受缓冲区
        MSComm1.OutBufferCount = 0  '清空传输缓冲区
        MSComm1.RThreshold = 1      '产生MSComm事件
        MSComm1.InBufferSize = 1024
        MSComm1.PortOpen = True
    End Sub
      

  5.   

    谢谢LS的更正 试了下 只能发送byte数组或者 字符串一般情况用byte数组比较直接吧
      

  6.   

    zdingyun 兄:   我按你的方法改了一下:
       Dim s As String
        Dim Data2 As Integer
        Dim Buffer(1) As Byte
        Dim ii As Long
        ii = 65534    s = Hex(ii)  '假设要发送数据10FF,注意这里低位是FF,也就是先会发送FF后发10
        MsgBox "s=" & s, vbDefaultButton1
        Data2 = Val("&H" & s)
        MsgBox "Data2=" & Data2, vbDefaultButton1
        CopyMemory Buffer(0), Data2, 2
        MsgBox Buffer(0), vbDefaultButton1
        MsgBox Buffer(1), vbDefaultButton1
        'MSComm1.Output = Buffer
    在msgbox里顺序显示的结果:s=FFFE,Data2=-2,254,255
    由于暂时没有单片机调试,我不敢保证其是不是正确的。
    所以我想问一下,这样的结果,如果传到单片机里,还会不会是FFFE?(本人菜鸟一个,望指教!谢谢)
      

  7.   

    没有错的
    FFFE 用integer表示就是-2
    分开单独表示成2个byte 就是
    FE ,FF
    254,255
      

  8.   

    有个问题,如果把ii定义为integer类型,ii=65534的话,就提示出错:溢出。
    想不出问题所在……
      

  9.   

    LZ,你的代码中定义ii为Long数据类型,应为32位数据,占4字节。当定义为Integer数据类型时是16位数据,占2字节。
      

  10.   

    我知道了。定义为Integer数据类型是有符号型的
      

  11.   

    各位,能不能帮我看看下面的程序?
    我怎么看,也看不懂。
    其功能是实现PC传输一个或者两个字节到单片机里(传输的是时钟号,如果大于768就不行了)Dim mydata2(1 To 1) As Byte
    Dim buffer2 As Variant
    Dim ii, i As Integer
    i = 768
    mydata2(1) = 254
          Select Case i
             Case 1 To 96
                    mydata2(1) = 254
             Case 97 To 192
                    mydata2(1) = 253
             Case 193 To 288
                    mydata2(1) = 251
             Case 289 To 384
                    mydata2(1) = 247
             Case 385 To 480
                    mydata2(1) = 239
             Case 481 To 576
                    mydata2(1) = 223
             Case 577 To 672
                    mydata2(1) = 191
             Case 673 To 768
                    mydata2(1) = 127
          End Select
          ii = mydata2(1)
          buffer2 = mydata2()
          'Comm2.Output = buffer2
          MsgBox mydata2(1), vbDefaultButton1
          mydata2(1) = CByte((i - 1) Mod 96 + 128)
          buffer2 = mydata2()
          MsgBox mydata2(1), vbDefaultButton1
          Comm2.Output = buffer2
      

  12.   

    你代码中的如下一大段代码是无用的    mydata2(1) = 254
        Select Case i
            Case 1 To 96
                mydata2(1) = 254
            Case 97 To 192
                mydata2(1) = 253
            Case 193 To 288
                mydata2(1) = 251
            Case 289 To 384
                mydata2(1) = 247
            Case 385 To 480
                mydata2(1) = 239
            Case 481 To 576
                mydata2(1) = 223
            Case 577 To 672
                mydata2(1) = 191
            Case 673 To 768
                mydata2(1) = 127
        End Select
            ii = mydata2(1)
            buffer2 = mydata2()现将代码修改,未发现大于768就不行:Private Sub Command1_Click()
        Dim mydata2(1 To 1) As Byte
        Dim buffer2 As Variant
        Dim ii As Integer, i As Integer
        i = Val(Text1) '768
                'Comm2.Output   =   buffer2
                'MsgBox mydata2(1), vbDefaultButton1
            mydata2(1) = CByte((i - 1) Mod 96 + 128)
            buffer2 = mydata2()
                'MsgBox mydata2(1), vbDefaultButton1
            MSComm1.Output = buffer2
    End SubPrivate Sub Form_Load()
        Text1 = ""
        MSComm1.PortOpen = True
    End Sub