在做vb应用程序和ARM的RS232串口通讯时,在通讯一段时间,程序销毁,然后会出现"0x73434912指令引用"0x0000000c"内存,该内存不能读."的错误
我的程序过程简单描述一下:
1.ARM串口通讯每20ms往上发送定长的19个字节的数据,vb在oncomm事件里接收串口配置
         MainUnderMSComm.CommPort = Underwater_COMConfig.Port
                MainUnderMSComm.Settings = Underwater_COMConfig.Baudrate + ",N,8,1"
                MainUnderMSComm.InputMode = comInputModeBinary 'comInputModeText
                MainUnderMSComm.InputLen = 0
                MainUnderMSComm.RThreshold = 1
                
                MainUnderMSComm.PortOpen = True
oncomm事件里接收
 Case comEvReceive
        MainUnderMSComm.InputLen = 1 '逐字节接收
         i = 0
        While i < 20 - 1 '等待直到收到数据
        Do        Loop Until (MainUnderMSComm.InBufferCount <> 0)
         rbuf(i) = MainUnderMSComm.Input(0)
       '  Debug.Print rbuf(i)
       '  Call Getdata1
        i = i + 1
        Wend
    MainUnderMSComm.InBufferCount = 0
当我隐掉这段代码,测试好长时间不出问题,一加上这段代码就出现上面出现的错误,这段代码不知道是什么原因造成的一段时间后出问题,是接收的数据有问题,还是实现有问题,我发现ONCOMM事件并不象我配置一样,一个字节中断一次,而是不定的,可能是8个字节,也可能很多字节,请大家指教!

解决方案 »

  1.   

    进入oncomm事件后,可以延时一段时间再读取啊
      

  2.   

    LZ:
    1)MSComm控件的OnComm事件达不到20ms响应速度.你得降低下位机的发送频次.
    2)既然ARM串口通讯往上发送定长的19个字节的数据,那么MSComm控件的属性RThreshold = 19
      

  3.   

    达不到20ms响应速度吗?
    不会吧
    我这速度够慢了
    改为RThreshold = 19,还是出现上面错误
      

  4.   

    请问LZ你的波特率设置是多少?
    如果是9600的话,那么每秒共发送950字节数据,COM不出问题是不可能的.
      

  5.   

    测试证明OnComm事件触发最快也要25MS/次,关注此问题的讨论.http://zhidao.baidu.com/question/129433350.html 
      

  6.   

    合适的方法是降低频次,建议ARM串口通讯每50MS往上发送一次数据包.
      

  7.   

    你那Call Getdata1里是怎么做的?
      

  8.   

    Call Getdata1
    里是判断头,判断校验
    Public Sub Getdata1()
          Dim Tmp1 As A_byteArr
        Dim Tmp2 As A_integer
       
        If rbuf(0) = &HAA And rbuf(1) = &H1 Then 'And rbuf(18) = CheckSum1(15) Then '加校验
           '罗盘的三个数据:首向、纵倾、横倾
                Tmp1.byteArr(0) = rbuf(3)
                Tmp1.byteArr(1) = rbuf(4)
                LSet Tmp2 = Tmp1
                SensorInfor.head = 0.1 * Tmp2.int
                
                Tmp1.byteArr(0) = rbuf(5)
                Tmp1.byteArr(1) = rbuf(6)
                LSet Tmp2 = Tmp1
                SensorInfor.Pitch = 0.1 * Tmp2.int
                
                Tmp1.byteArr(0) = rbuf(7)
                Tmp1.byteArr(1) = rbuf(8)
                LSet Tmp2 = Tmp1
                SensorInfor.Roll = 0.1 * Tmp2.int
            
           '数据:深度和角速度
                Tmp1.byteArr(0) = rbuf(9)
                Tmp1.byteArr(1) = rbuf(10)
                LSet Tmp2 = Tmp1
                SensorInfor.Depth = 0.01 * Tmp2.int
                
                Tmp1.byteArr(0) = rbuf(11)
                Tmp1.byteArr(1) = rbuf(12)
                LSet Tmp2 = Tmp1
                SensorInfor.Height = 0.1 * Tmp2.int
                
                Tmp1.byteArr(0) = rbuf(13)
                Tmp1.byteArr(1) = rbuf(14)
                LSet Tmp2 = Tmp1
                SensorInfor.AngleSpeed = 0.1 * Tmp2.int
            '漏水报警
                SensorInfor.WaterAlarm(0) = rbuf(15)
            '绝缘
                SensorInfor.Insulation(0) = rbuf(16) '绝缘1
                SensorInfor.Insulation(1) = rbuf(17) '绝缘2
             
       End If
    加校验好像不行,原因是我数据段中可能会出现头一样的字段,还有可能是数据只发送当前帧前几个字节,后面数据又被后面一帧填充了,造成当前帧不完整
      

  9.   

    LSet在一定程度上相当于封装了的Copymemory,将这个函数里面好好检查一下吧.先不调用这个函数看看会不会有问题如果确认是这个函数里的问题,多半是你自己没把字节计算好.其实这种需要字节位移,还是用copymemory吧,开销貌似少得多.
      

  10.   

    那么理论上每秒可发送960字节的数据,LZ按20ms发送一次数据包(19字节),则每2个数据包之间仅有0.2ms空隙,对于RS232通信标准而言几乎是无间隔,成为一个连续长数据包,那必然将加重数据处理的负担.
      

  11.   

    我说错了,我ARM串口发送任务是时序管理的,100ms轮到一次,也就是100ms频次,不会出现你说的问题,发送任务执行时间是20ms