一个oncomm事件问题
我想实现,发一个命令,就接受一个数据
Private Sub Command2_Click()
Dim A As String
MSComm1.Output = "!0R" & Chr$(13)
Delay_Time (100)
A = MSComm1.Input
Debug.Print A
End Sub
这样写代码可以实现我的要求,可是如果换成OnComm()事件,就不行了(执行次数太多了)。
我不清楚如果不用oncomm事件是否有什么弊端oncomm事件代码如下
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
Call Delay_Time(100)
Dim Buffer As Variant
Buffer = MSComm1.Input
Debug.Print "接收 - " & Buffer
Text1.Text = Buffer
End Select
End Sub
事件执行的次数太多了
我想实现,发一个命令,就接受一个数据
Private Sub Command2_Click()
Dim A As String
MSComm1.Output = "!0R" & Chr$(13)
Delay_Time (100)
A = MSComm1.Input
Debug.Print A
End Sub
这样写代码可以实现我的要求,可是如果换成OnComm()事件,就不行了(执行次数太多了)。
我不清楚如果不用oncomm事件是否有什么弊端oncomm事件代码如下
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
Call Delay_Time(100)
Dim Buffer As Variant
Buffer = MSComm1.Input
Debug.Print "接收 - " & Buffer
Text1.Text = Buffer
End Select
End Sub
事件执行的次数太多了
MSComm1.InBufferSize = 44
MSComm1.OutBufferSize = 44
设置了
MSComm1.InputMode = comInputModeText
MSComm1.DTREnable = True
MSComm1.Handshaking = Handshaking
MSComm1.Settings = "9600,n,8,1"
MSComm1.InputLen = 0
MSComm1.InBufferSize = 44
MSComm1.OutBufferSize = 44
MSComm1.PortOpen = True
MSComm1.RThreshold = 1是否根延时有关系阿
我单步调试,显示的结果是对的,如果去掉单步调试,就接收近来很多没用的东西(空值)
设置RThreshold=1为每字节触发,数据定长的话将它设置成定长触发
接受的数据是定长的,该怎么设置
啸峰工作室http://www.gjwtech.com/serialcomm.htm
要学会用搜索引擎http://www.google.com,http://www.baidu.com等,许多问题网上有现成的答案
详细的恐怕要周末在说了,不过你可以尽量的加大延时看看,还有在延时的函数的循环当中,一定要加入doevents,如:
private sub Delay_Time(byval HowLong as Long)
dim t1 as single
dim t2 as single
t1=timer()
t2=timer
while not (t2-t1)*1000#>=Howlong
doevents:doevents:doevents
t2=timer()
wend
end sub
另外对于oncomm事件,建议改为下面的样子:
private ...._oncomm()
static blnInProcess
dim ... if blnInprocess then exit sub
blnInprocess=true ....
....
end if blnInProcess
end sub
以上的意思就是放置oncomm事件的重入,虽然我不记得oncomm是否会产生重入的现象,当时有备无患吧。
再提一句,前面的延时函数我没有经过调试,你自己调一下吧。