如题,而且我打包了所有的dll动态连接库过去也不行,我的电脑上没一点问题,我试了好几台都没事,但是在那个人那边的电脑上就出现数组下边越界,在串口发送的函数里我用的发送缓冲区是sendbuf(5),而且也是用到了sendbuf(5),也没往后面用呀,求高手解答。。太奇怪了

解决方案 »

  1.   

    本帖最后由 bcrun 于 2012-08-31 20:50:11 编辑
      

  2.   

    ReDim recbuf(0 To inputlen)是不是多了1呀,base 0和base 1的差别?
      

  3.   

        ReDim recbuf(0 To inputlen)  这种定义方法是定义多维数组,但我看你只是作为一维使用,那你改成    ReDim recbuf( inputlen)  试试行不行?
      

  4.   

    居然看不明白,改为ReDim recbuf(0 To inputlen-1),这样数组的大小才是inputlen,否则大小是inputlen+1。
      

  5.   

    inputlen = MSComm.InBufferCount
    If inputlen = 0 Then Exit Sub
      

  6.   

    回复楼上的楼上,怎么是inputlem+1呢??
    vb中数组是从0开始计数的,我这样写在我的电脑上没有任何问题的,别的电脑也没问题,就是个别人的电脑上会出下标越界
      

  7.   

    8楼的方法有道理,但是呢,我串口设置的是收到6个字节触发这个事件,所以呢inputlen不可能是0的,只要进入这个事件那么说明inputlen就是6
      

  8.   

    别人是什么系统什么环境啊?? 会不会触发这事件那里有问题啊? 因为受到EOF也是会触发这事件的 
      

  9.   

    别人的系统也是win7的,xp的也有,都是出错,最后没办法我只能加出错处理屏蔽这个错误,但是用u转串的线没有热河问题
      

  10.   

    当然出错了,ReDim recbuf(0 To inputlen)得到的数组长度是inputlen + 1,这里你给出的0和inputlen分别是下限和上限,都是包含在内的,当然是inputlen + 1了。写两句测试代码打个断点,看看数组的大小是多少。最好的检验方法是动手实验,眼过千遍不如手过一遍。
      

  11.   

    嗯,回楼上,我的程序在我的电脑上没有任何问题呀,但是在别人公司的电脑上用自带的串口运行才会出现这个错误,用usb转的串口不会出现这个问题
      

  12.   

    回楼上,只有一个串口的接收缓冲区没有定义,使用了默认,但是这样运行程序不出错呀,在我的电脑上不出错,他们电脑上只自带的串口出错,但是用usb转串口的也不出错呀
      

  13.   

    你确认 速率 停止位,奇偶校验都没有问题吗?
    我是怕有些电脑的串口不支持usb的速率,或者有些电脑串口设置默认就是没停止位或者没奇偶校验之类的,要是你电脑没设置,就导致设置不同了另外,数组下标越界,那你就定义大一点啊,有点冗余又不会占用什么资源,到时候加个空判断就行了嘛
      

  14.   


    与机器的速度有关。速度越快的机器,代码运行到 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
      

  15.   


    说的很有可能,但是有点不明白
    楼主原代码:
     inputlen = MSComm.InBufferCount
        ReDim recbuf(0 To inputlen)
     recbuf = MSComm.Input你的意思是这些语句之间会有数据陆续到来,导致定义的数组装不下??
      

  16.   

    回楼上的楼上,我的是来6个数据才会触发on_comm的事件的
      

  17.   

    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 读出串口接收缓存区的值,这样比较通用
      

  18.   

    是呀,但是他们那边程序就运行不起来,会出现下标越界,这怎么解释??想来好久都不知道咋弄
    前面贴的代码运行都不行,出现recbuf下标 越界,只有最后这样写才行