与PC机相连的是一台通信设备,用超级终端能收发,现在就是用VB做一个界面,取代超级终端。开始,PC机要不断的询问"READY?",如果收到"I am ready",则表示设备准备就绪。我的程序如下:
(省略串口初始化部分)
MSComm1.Output = "READY?" & Chr$(13)
Do
DoEvents
MSComm1.Output = "READY?" & Chr$(13)'不断的发送询问信息
Buffer$ = Buffer$ & MSComm1.Input
Loop Until Right(Buffer$, 1) = Chr$(13)'收到的信息以回车结束(规定好了的) 从发出询问,至收到信息跳出循环,大概需要10秒,当然这是不正确的,在超级终端上试,马上就有返回信息,请问我的程序循环用得不对吗?应该怎么改?
(省略串口初始化部分)
MSComm1.Output = "READY?" & Chr$(13)
Do
DoEvents
MSComm1.Output = "READY?" & Chr$(13)'不断的发送询问信息
Buffer$ = Buffer$ & MSComm1.Input
Loop Until Right(Buffer$, 1) = Chr$(13)'收到的信息以回车结束(规定好了的) 从发出询问,至收到信息跳出循环,大概需要10秒,当然这是不正确的,在超级终端上试,马上就有返回信息,请问我的程序循环用得不对吗?应该怎么改?
是不是有这中可能? MSComm1.Input取出来的可能正在发送“I AM READY”13 中途,
下次又错过了回车, 试着改成 if instr(1,buffer,chr$(13)) 看看
还有,从程序设计角度来说:不应该把接收放在这里,而应该在ONCOMM事件中。这样,你可以知道
是不是缓冲区满了,是否接收到数据,产生了错误信息等而相应处理。当然你看看闸门的设置是不是太大了,缓冲区的大小怎么样。对你这个程序来说mscomm1.RThreshold <>1 也有可能产生上述原因.想想为什么?
Private Sub Command1_Click()
Dim MyData As Variant
Dim strData As String
Dim i As Integer
begin:
i = i + 1
MSComm1.Output = "READY?" & Chr$(13)
MSComm1.InBufferCount = 0 '清空接收缓冲区
Do
DoEvents
Loop Until MSComm1.OutBufferCount = 0 '
sngTime = Timer
Do
DoEvents
If Abs(Timer - sngTime) > 100 Then GetData = False: Exit Function '等待100ms
Loop Until MSComm1.InBufferCount = Len("I am ready") '如果有回车再+1
MyData = MSComm1.Input
strData = MyData
If i > 10 Then Exit Sub
If MyData <> "I am ready" Then
GoTo begin
Else
MsgBox "ok"
Next i
End Sub