在做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.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)MSComm控件的OnComm事件达不到20ms响应速度.你得降低下位机的发送频次.
2)既然ARM串口通讯往上发送定长的19个字节的数据,那么MSComm控件的属性RThreshold = 19
不会吧
我这速度够慢了
改为RThreshold = 19,还是出现上面错误
如果是9600的话,那么每秒共发送950字节数据,COM不出问题是不可能的.
里是判断头,判断校验
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
加校验好像不行,原因是我数据段中可能会出现头一样的字段,还有可能是数据只发送当前帧前几个字节,后面数据又被后面一帧填充了,造成当前帧不完整