我在做接收由单片机通过串口发送数据的程序
自己定义了延时函数如下 因为接收的数据不是定长的
所以设置 Rthreshold 为 1,接收缓冲区收到每一个字符都会使 MSComm 控件产生 OnComm 事件
问题就出来了 在接收的数据过多时候超过2W个字节 程序就会在
⑴这里出错 提示溢出堆栈空间 请高手帮忙 ( ⑵ 那里的延时不能去掉 )
Sub TimeDelay(DT As Long)
Dim t As Long
t = GetTickCount()
Do
DoEvents ..........................出错的地方.............. ⑴
Loop Until GetTickCount - t > DT
End SubDim buffer As Variant
Dim Receive() As Byte
Private Sub MSComm1_OnComm()Select Case MSComm1.CommEvent
Case comEvRing
Case comEvReceive
TimeDelay (200) .................................⑵ buffer = MSComm1.Input
BytesReceived() = buffer .........处理数据过程......End SelectEnd Sub
自己定义了延时函数如下 因为接收的数据不是定长的
所以设置 Rthreshold 为 1,接收缓冲区收到每一个字符都会使 MSComm 控件产生 OnComm 事件
问题就出来了 在接收的数据过多时候超过2W个字节 程序就会在
⑴这里出错 提示溢出堆栈空间 请高手帮忙 ( ⑵ 那里的延时不能去掉 )
Sub TimeDelay(DT As Long)
Dim t As Long
t = GetTickCount()
Do
DoEvents ..........................出错的地方.............. ⑴
Loop Until GetTickCount - t > DT
End SubDim buffer As Variant
Dim Receive() As Byte
Private Sub MSComm1_OnComm()Select Case MSComm1.CommEvent
Case comEvRing
Case comEvReceive
TimeDelay (200) .................................⑵ buffer = MSComm1.Input
BytesReceived() = buffer .........处理数据过程......End SelectEnd Sub
其实我也知道是由于调用TimeDelay函数次数太多了, 造成堆栈溢出
有没有别的延时函数 给推荐一下 ?
如果是, 则按我上面所讲的办法处理。除非,和单片机的通讯包没有规定格式(通讯协议),那就不好办了。
比较郁闷
那是你的数组下标越界,不是doevents的错误
Dim Receive() As Byte
Private Sub Timer1_Timer()
buffer = MSComm1.Input
BytesReceived() = buffer
'.........处理数据过程......
End SubPrivate Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvRing
Case comEvReceive
Timer1.Enabled = False
Timer1.Interval = 200
Timer1.Enabled = True
End Select
End Sub
Dim Receive() As Byte
Private Sub Timer1_Timer()
Timer1.Enabled = False
buffer = MSComm1.Input
BytesReceived() = buffer
'.........处理数据过程......
End SubPrivate Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvRing
Case comEvReceive
Timer1.Interval = 200
Timer1.Enabled = True
End Select
End Sub
单片机通讯协议是有的 接收的数据是由每10个字节的小数据包组成的
数据发送完毕后也有结束符 OnEvReceive事件发生时,应该是单片机已经处理结束并且返回数据的时候了,此时单片机已经不再需要时间去处理信息了,你这个延时,从功能上讲应该是保证在buffer = MSComm1.Input时能接收到一个从单片机发送来的完整的数据包。
======================
而且因为数据包有结束符,所以jadeluo(秀峰) 开始说的办法应该可行
时间 单片机 PC
1 发送一个字节
2 继续发送 产生OnEvReceive事件
3 继续发送 开始接收, 此时收到的不止一个字节, 但是不一定是一个完整的通讯包因此,只要制定了通讯包的格式,接收方就应该按照先缓存再处理的方法来比较高效地完成通讯。
时间 单片机 PC
1 发送一个字节
2 继续发送 产生OnEvReceive事件
3 继续发送 开始处理OnEvReceive事件
4 继续发送 由于某些原因, 未能立即接收
.
.
.
n 继续发送 开始接收, 此时收到的不止一个字节, 而且有可能已经是若干个完整的通讯包了反正不管是什么样的情况, 缓存后再按通讯包格式来处理, 总能正确地完成通讯。
sub delay(delaytime as single)
dim start
start=timer
do while timer<start+delaytime
doevents
loop
end sub
因为你的buffer为局部变量,是在栈中分配的,当数据很大时,会溢出的。
当然,执行doevents后,会处理事件队列的其他事件,很可能是其他事件引起的栈溢出,这个问题很难解决阿,应该跟你当时的系统有关系