VB的OnComm事件中的疑问。

PrivateSubMSComm1_OnComm()StaticcntAsIntegerDimreceive_cntAsIntegerDimi%,j%DimArr()As... Private Sub MSComm1_OnComm()

Static cnt As Integer
Dim receive_cnt As Integer
Dim i%, j%
Dim Arr() As Byte
Dim s As String
Select Case MSComm1.CommEvent
Case comEvReceive
receive_cnt = MSComm1.InBufferCount '接收缓冲区的字节数
' 往暂存区存二进位资料
Arr = MSComm1.Input

Rec_num = UBound(Arr)
ReDim Rec_dat(0 To Rec_num) As Byte
For j = 0 To Rec_num
Rec_dat(j) = Arr(j)
Timer1.Enabled = True
Next j

s = ""
For i = 0 To receive_cnt - 1
'报文串显示
If Arr(i) > 15 Then
s = s + Hex(Arr(i)) + " "
Else
s = s + "0" + Hex(Arr(i)) + " "
End If

cnt = cnt + 1
Next i

Text1.Text = Text1.Text & s

If cnt >= 300 Then
Text1.Text = ""
cnt = 0
End If
Case comEvSend
End Select
End Sub
Private Sub Timer1_Timer()
If UBound(Rec_dat) - LBound(Rec_dat) >= 7 Then

MsgBox "1"
Timer1.Enabled = False
End If
End Sub
Text1里显示了有8个数据,但是 为什么If UBound(Rec_dat) - LBound(Rec_dat) >= 7 Then这句经常不成立,数组里Rec_dat应该有8个字符总成立呀,也没看见丢死数据呀。
没财富了,求帮忙呀,非常感谢。
定时器定时20ms
展开
 我来答
neusoft_monk
2013-01-29 · TA获得超过2129个赞
知道小有建树答主
回答量:469
采纳率:75%
帮助的人:128万
展开全部
Rec_dat 你定义的是局部变量。
在一个函数中定义的变量,在另一个函数中是看不到的。

你要定义成全局变量才行。
在Private Sub MSComm1_OnComm()前加句
private Rec_dat(0 To 7) As Byte 试一下。

只是看一下你代码,没调度。原因应该没问题,修改方法不行你再研究下。
更多追问追答
追问
我试试 ,Dim Rec_dat() As Byte 是定义的全局变量,我看了下,UBound(Rec_dat)-LBound(Rec_dat)多数情况下是等于7,少部分情况是0啊,1啊,5啊,之类的。
我这样写Text2.Text=Text2.Text & Hex(Rec_dat) 也是显示有8个数据的。
追答
那就是由于你是在timer事件中定义的。
这个事件是定期发生的事件。

有可能事件响应时,你正在对Rec_dat进行修改。

比如 如果timer事件响应时,你正在执行ReDim Rec_dat(0 To Rec_num) As Byte这个语句,就会发生问题。

如果你想这个问题不发生,可以在Private Sub MSComm1_OnComm()这个函数的入口关闭timer,出口处开启Timer就行了。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式