各位兄弟,指导指导啊!1、我要通过内存拷贝交换两个相同结构中的内容,为什么总是得不到正确的结构长度?
Public Type udt
  Type As Byte
  Addr As Byte
  Content As String * 44
  DateTime As Double
End Type
如何通过CopyMemory将内容完整的拷贝到一个Byte()数组中?2、串口在低伯特率设置下(300,n,8,1)一次发送字节数有限制吗?我发送了一个100字节数组,可只能接收到28个?

解决方案 »

  1.   

    Option Explicit
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    Private Type udt
      Type As Byte
      Addr As Byte
      Content As String * 44
      DateTime As Double
    End TypePrivate Sub Command1_Click()
        Dim myudt As udt
        myudt.Addr = 34
        myudt.Type = 1
        myudt.Content = "this is test"
        myudt.DateTime = 12345.6789
        Dim i As Long
        i = LenB(myudt)
        Dim mybyte() As Byte
        ReDim mybyte(i - 1)
        CopyMemory mybyte(0), myudt, i
        Dim j As Long
        For j = 0 To i - 1
            Debug.Print mybyte(j)
        Next
    End Sub
      

  2.   

    LenB(myudt)
    比实际长度要大啊?
      

  3.   

    有限制也不至于100个字节也不行呀,应该是你程序的问题:
    建议:
    1.
    发送时每个字节分开发,中间加适当延时(1-20ms),发完后再延时一段时间(接收数据应当等到全部字节接收到后再从接收缓冲区读取数据)读取数据;读取数据采用查询方式,一次性取出不要一个字节一个字节的取,不要使用事件驱动方式。使用通讯协议会好一些,但会增加外部设备编程的复杂程度。串口参数使用控件的缺省值既可,不必额外设置
    2.
    如果要使用事件驱动方式的话注意设置RThreshold属性
      

  4.   

    LenB(myudt)
    比实际长度要大啊?用len试试
      

  5.   

    LenB(myudt)=100
    Len(myudt)=54
    ???
      

  6.   

    问题2已经解决,是由于我用 PortOpen = False 太快造成,200分全用于问题1 !
      

  7.   

    Public Type udt
      Type As Byte             '1 byte
      Addr As Byte             '1 byte
      Content As String * 44   '44 byte, unicode 88 byte
      DateTime As Double       '8 byte
    End Type就算string是unicode也是 98字节啊?为何lenb(udt) = 100?
      

  8.   

    不好意思,上面我说错了。
    1、string * 44表示是有44个字符的字符串,但是每一个vb中的字符串实际是unicode字符因此会占两个字节。
    2、自定义类型变量,在分配内存时是会边界对齐,在VB中自定义类型是4字节边界对齐,也就是说自定义内心变量实际分配的内存大小是4的整数倍字节,这就是为什么Lenb(udt)=100的原因。在其他的语言中的结构类型也有这个问题,但是像VC、delphi等是可以让用户定义边界对齐大小的
      

  9.   

    gcj123(佛的光辉),你自己说的有没有试过啊!
    1.
    Private Type Udt
        b As Byte
    End Type
    lenb(udt)=1
    2.
    Private Type Udt
        b1 As Byte
        b2 As Byte
    End Type
    lenb(udt)=2
    3.
    Private Type Udt
        b1 As Byte
        i As Integer
    End Type
    lenb(udt)=4
    可见一个占有内存n个字节变量的自然边界是地址为n的倍数的任意内存地址。吃饭ing..........
    呆会回来。
      

  10.   

    可见一个占有内存n个字节变量的自然边界是地址为n的倍数的任意内存地址。
    这句话说错了。
    如果n为8,16,32时,只要到4的倍数的内存地址。
      

  11.   

    现在来回答楼主的第2个问题。
    vb的string是unicode,所以占2个字节,在内存中它的地址应该是2的倍数。
    Public Type udt
      Type As Byte             '1 byte
      Addr As Byte             '1 byte
      Content As String * 44   '44 byte, unicode 88 byte
      DateTime As Double       '8 byte
    End Type
    udt结构中,type+addr占2个字节,content占88个字节,这样是90个字节。datatime的长度是8个字节,内存中它的地址应该是4的倍数。前面90不是4的倍数,所以被原整到92,在加上8,就是上面说的100了。
      

  12.   

    我仔细研究发现,在string后面加了两字节,值为 &H20 &H0
      

  13.   

    Public Type udt
      Type As Byte             '1 byte
      Addr As Byte             '1 byte
      Content As String * 44   '44 byte, unicode 88 byte
      DateTime As Double       '8 byte
    End Type
    假设Type的内存地址为:8002,那么DateTime的地址不正好为8002+90 = 8092 为4的倍数,难道udt的起始地址一定是4的倍数?