什么“vb负数转换2字节”? 是 VB6整数转2字节吧!
其实可以直接运算的。
拆分:
Buffer(0) = Num And 255
Buffer(1) = (Num And &HFF00) \ 256 And 255合成:
If (Buffer(1) < 128) Then
   Num = Buffer(1) * 256 Or Buffer(0)
Else
   Num = (-256 Or Buffer(1)) * 256 Or Buffer(0)
End If

解决方案 »

  1.   

    本帖最后由 bcrun 于 2013-11-30 12:36:06 编辑
      

  2.   

    首先感谢of123解答,我还有个问题请教:我想用mscomm控件的oncomm事件实时接收PLC的定时器和寄存器的数据,每种数据如何区分接收分别显示?
      

  3.   

    这是是协议和数据格式问题,应该和 PLC 代码编写者协调,统一数据的数据链路层协议,例如 Frame 的构成,包头各个数据域的长度和意义,是否有包尾校验码等等。
      

  4.   

    三菱PLc,接受数据格式为chr(02)+不定长数据+chr(03)+2位合校验,收到的不同长度的数据如何区分,
      

  5.   

    还要保证数据中不能出现 02 和 03。你这个协议有点问题。最好的 02 之后附加一个长度域(需要几个字节要根据你可能的最长数据块来确定)。这样接收端就知道长度,不必根据接收到的信息的值来判断是否包头和包尾。还有一种方法,是将你所有的传输数据改成 ASCII 码(数据长度要增加一倍)。例如,你要发送数据 0x02, 0x03,就要将这 4 个半字节看作字符,转换成 0x30, 0x32, 0x30, 0x33 来发送。这样就可以保证你的数据中不会有 02, 03 这样的数据。当然,恢复数据时要逆向转码。
      

  6.   

    使用 ASCII 码传输时:
    (1) 负数如何转换成 4 个字节 
        strNum = Right("000" & Hex(-80), 4)
        Buffer(0) = Asc(Mid(strNum, 1, 1))
        Buffer(1) = Asc(Mid(strNum, 2, 1))
        Buffer(2) = Asc(Mid(strNum, 3, 1))
        Buffer(3) = Asc(Mid(strNum, 4, 1))(2) 4 个字节合成一个整数 
        Num = Val("&H" & Chr(Buffer(0)) & Chr(Buffer(1)) & Chr(Buffer(2)) & Chr(Buffer(3)))
      

  7.   

    Dim order As Integer
    Dim d(0 To 1) As StringPrivate Sub Form_Load()
    MSComm1.PortOpen = True
    order = 0MSComm1.InBufferCount = 0
     MSComm1.OutBufferCount = 0
    End Sub
    Private Sub Timer1_Timer() Select Case order
       Case 0
         d(0) = Chr(2) + "0" + "0802" + "0A" + Chr(3) + "6E"
        Case 1
         d(1) = Chr(2) + "0" + "1002" + "0A" + Chr(3) + "67"
     
     End Select
     
    MSComm1.Output = d(order)Call Sleep(50)
    End SubPrivate Sub MSComm1_OnComm()If MSComm1.CommEvent = comEvReceive ThenTimer1.Enabled = Falsea = Trim(MSComm1.Input)Select Case order
       Case 0
       
         Text1.Text = Text1.Text + a
       order = 1
       Case 1
      
         Text2.Text = Text2.Text + a
       order = 0
    End Select
    End If
    Timer1.Enabled = True
    End Sub
    这段代码是我做了发送2种数据的情况,如果sleep设小了,发送一个指令时会在2个文本框里都有显示,数据接收太乱,如果设到50,1指令接到1文本框里,2指令接到2文本框里,有什么办法让它不延时,不停地接收,不同的指令显示在对应的文本框里。