与机器的速度有关。速度越快的机器,代码运行到 ReDim 时,它收到的字节数越少。当你后续代码超过它 Redim 的空间,它就越界了。加一点延时试试。或者循环到它接收到的字节数大于你可处理的值。 Case comEvReceive
inputlen = MSComm.InBufferCount Do Until inputlen >= 6 Doevents inputlen = MSComm.InBufferCount Loop ReDim recbuf(0 To inputlen - 1) recbuf = MSComm.Input Case comFrame x = MsgBox("帧错误!", 16) Exit Sub Case comEventOverrun x = MsgBox("数据丢失", 16) Exit Sub
Private Sub MSComm_OnComm() Dim a& Dim buffer As String Dim recbuf(0 To 5) As Byte Dim inlen As Integer Dim i As Integer Dim x As Variant Dim c As Variant On Error GoTo error1 Select Case MSComm.CommEvent Case comEvReceive inlen = MSComm.InBufferCount Do Until inlen >= 6 DoEvents inlen = MSComm.InBufferCount Loop i = 0 For Each c In MSComm.Input recbuf(i) = c i = i + 1 Next c Case comFrame x = MsgBox("帧错误!", vbCritical, "接受数据错误!!") Exit Sub Case comEventOverrun 新改后的代码完全好了,结贴,问题在于他们那边的电脑里vb程序运行时所有的变量鼻息声明,数组必须是固定的,数据类型的转换必须是显式的好比你用string的buffer和数组型的recbuf()转存数据就会出错,好比recbuf()=buffer他那边的运行就会数据类型不匹配的错误。所以建议写串口的时候别转存数据,用for each 读出串口接收缓存区的值,这样比较通用
If inputlen = 0 Then Exit Sub
vb中数组是从0开始计数的,我这样写在我的电脑上没有任何问题的,别的电脑也没问题,就是个别人的电脑上会出下标越界
我是怕有些电脑的串口不支持usb的速率,或者有些电脑串口设置默认就是没停止位或者没奇偶校验之类的,要是你电脑没设置,就导致设置不同了另外,数组下标越界,那你就定义大一点啊,有点冗余又不会占用什么资源,到时候加个空判断就行了嘛
与机器的速度有关。速度越快的机器,代码运行到 ReDim 时,它收到的字节数越少。当你后续代码超过它 Redim 的空间,它就越界了。加一点延时试试。或者循环到它接收到的字节数大于你可处理的值。 Case comEvReceive
inputlen = MSComm.InBufferCount
Do Until inputlen >= 6
Doevents
inputlen = MSComm.InBufferCount
Loop
ReDim recbuf(0 To inputlen - 1)
recbuf = MSComm.Input
Case comFrame
x = MsgBox("帧错误!", 16)
Exit Sub
Case comEventOverrun
x = MsgBox("数据丢失", 16)
Exit Sub
说的很有可能,但是有点不明白
楼主原代码:
inputlen = MSComm.InBufferCount
ReDim recbuf(0 To inputlen)
recbuf = MSComm.Input你的意思是这些语句之间会有数据陆续到来,导致定义的数组装不下??
Dim a&
Dim buffer As String
Dim recbuf(0 To 5) As Byte
Dim inlen As Integer
Dim i As Integer
Dim x As Variant
Dim c As Variant
On Error GoTo error1
Select Case MSComm.CommEvent
Case comEvReceive
inlen = MSComm.InBufferCount
Do Until inlen >= 6
DoEvents
inlen = MSComm.InBufferCount
Loop
i = 0
For Each c In MSComm.Input
recbuf(i) = c
i = i + 1
Next c
Case comFrame
x = MsgBox("帧错误!", vbCritical, "接受数据错误!!")
Exit Sub
Case comEventOverrun
新改后的代码完全好了,结贴,问题在于他们那边的电脑里vb程序运行时所有的变量鼻息声明,数组必须是固定的,数据类型的转换必须是显式的好比你用string的buffer和数组型的recbuf()转存数据就会出错,好比recbuf()=buffer他那边的运行就会数据类型不匹配的错误。所以建议写串口的时候别转存数据,用for each 读出串口接收缓存区的值,这样比较通用
前面贴的代码运行都不行,出现recbuf下标 越界,只有最后这样写才行