各位兄弟,指导指导啊!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个?
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个?
解决方案 »
- VB分页问题
- Date()函数问题
- 用Winsock发送需要身份验证的邮件(yeah.net),返回错误421... 附代码
- 高手们,高深问题 动态创建 MSFlexGrid 问题,不过我是在类模块中,代码如下
- 怎样选择一个access表中某个字段相同的记录
- 针式打印机报表问题?
- 使用mciSendString播放wav,但是现在程序正常运行(mciSendString返回值非0)但是没有声音,这是为什么?
- 如何把事件查看器的日志文件(*.EVT)保存到数据库中?
- 能讨论一下 VB开发财务相关软件的经验吗,各位高手??(UP都有分)
- 如何进行数码相机编程?
- 关于用vb开发ActiveX,全局变量的初始化问题
- 因给不了分,再问。
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
比实际长度要大啊?
建议:
1.
发送时每个字节分开发,中间加适当延时(1-20ms),发完后再延时一段时间(接收数据应当等到全部字节接收到后再从接收缓冲区读取数据)读取数据;读取数据采用查询方式,一次性取出不要一个字节一个字节的取,不要使用事件驱动方式。使用通讯协议会好一些,但会增加外部设备编程的复杂程度。串口参数使用控件的缺省值既可,不必额外设置
2.
如果要使用事件驱动方式的话注意设置RThreshold属性
比实际长度要大啊?用len试试
Len(myudt)=54
???
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?
1、string * 44表示是有44个字符的字符串,但是每一个vb中的字符串实际是unicode字符因此会占两个字节。
2、自定义类型变量,在分配内存时是会边界对齐,在VB中自定义类型是4字节边界对齐,也就是说自定义内心变量实际分配的内存大小是4的整数倍字节,这就是为什么Lenb(udt)=100的原因。在其他的语言中的结构类型也有这个问题,但是像VC、delphi等是可以让用户定义边界对齐大小的
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..........
呆会回来。
这句话说错了。
如果n为8,16,32时,只要到4的倍数的内存地址。
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了。
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的倍数?