读书人

COM接收有关问题还没解决请高手帮忙

发布时间: 2011-12-27 22:22:55 作者: rapoo

COM接收问题还没解决,请高手帮忙看看我的代码,万分感谢。
--目的--:
通过单击命令1,得到设备当前频率,并显示在Frequency.txt 文本框;
通过单击命令2,得到设备当前温度,并显示在Temp.txt 文本框;

----问题如下----:
(1)点击命令1的话,Frequency.txt 为空白;再按一次,正常了;
(2)点击命令2的话,Temp.txt 显示的是命令1的频率信息;然后再点击一下命令2,这时Temp.txt 显示正常;

---代码----:

Private Sub Command1_Click() ' 初始化

MSComm1.CommPort = PortNo
MSComm1.Settings = "115200,n,8,1"
MSComm1.InputMode = comInputModeText ‘文本方式传输
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
MSComm1.RThreshold = 1 '通过oncomm事件读取COM的返回值
MSComm1.PortOpen = True
MSComm1.InputLen = 0

End Sub


Private Sub Command1_Click() ’1命令-得到设备当前频率

If MSComm1.PortOpen = True Then
MSComm1.Output = vbLf & "r?"
Frequency.Text = result
result = ""
End If

End Sub


Private Sub Command2_Click() ‘2命令-得到设备当前温度
If MSComm1.PortOpen = True Then

MSComm1.Output = vbLf & "t?"
Temp.Text = result
result = ""
End If

End Sub



Private Sub MSComm1_OnComm()

If (MSComm1.CommEvent = comEvReceive) Then

result = result & Trim(MSComm1.Input)

End If

MSComm1.InBufferCount = 0

MSComm1.OutBufferCount = 0

End Sub


应该按一次命令按钮就能得到正确的信息才行啊,

请问这是怎么回事?怎么解决啊?



[解决办法]
Dim blnIsFreq As Boolean

Private Sub Form_Load() ' 初始化

MSComm1.CommPort = PortNo
MSComm1.Settings = "115200,n,8,1"
MSComm1.InputMode = comInputModeText ‘文本方式传输
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
MSComm1.RThreshold = 1 '通过oncomm事件读取COM的返回值
MSComm1.PortOpen = True
MSComm1.InputLen = 0

End Sub

Private Sub Command1_Click() ’1命令-得到设备当前频率
If MSComm1.PortOpen = True Then
MSComm1.Output = vbLf & "r?"
End If
End Sub


Private Sub Command2_Click() ‘2命令-得到设备当前温度
If MSComm1.PortOpen = True Then
MSComm1.Output = vbLf & "t?"
End If
End Sub


Private Sub MSComm1_OnComm()

If (MSComm1.CommEvent = comEvReceive) Then

result = Trim(MSComm1.Input)

If blnIsFreq Then
Frequency.Text = Frequency.Text & result
Else
Temp.Text = Temp.Text & result
End If

End If


End Sub

结构还是不太好。最好能够判断已经接收到完整的信息,一次提取。
[解决办法]

VB code
Option Explicit    Dim result As String    Dim strSend As StringPrivate Sub Command1_Click()  '1命令-得到设备当前频率    If MSComm1.PortOpen = True Then        strSend = vbLf & "r?"        MSComm1.Output = strSend    End IfEnd SubPrivate Sub Command2_Click() '2命令-得到设备当前温度    If MSComm1.PortOpen = True Then        strSend = vbLf & "t?"        MSComm1.Output = strSend    End IfEnd SubPrivate Sub Form_Load()    MSComm1.CommPort = 1 'PortNo    MSComm1.Settings = "9600,n,8,1"    MSComm1.InputMode = comInputModeText '文本方式传输    MSComm1.InBufferCount = 0    MSComm1.OutBufferCount = 0    MSComm1.RThreshold = 1            '通过oncomm事件读取COM的返回值    MSComm1.PortOpen = True    MSComm1.InputLen = 0End SubPrivate Sub MSComm1_OnComm()    Select Case MSComm1.CommEvent    Case comEvReceive        result = result & Trim(MSComm1.Input)        If strSend = vbLf & "r?" Then            Frequency.Text = result            result = ""        ElseIf strSend = vbLf & "t?" Then            Temp.Text = result            result = ""        End If        MSComm1.InBufferCount = 0        MSComm1.OutBufferCount = 0    End SelectEnd Sub 


[解决办法]
存在两个问题
1)在 Command1_Click() 中发出命令后不能期望马上得到回复
2)每收到一个字符就会触发 MSComm1_OnComm() 事件

VB code
Option ExplicitPrivate m_Mode As LongPrivate result As StringPrivate Sub Form_Load()    MSComm1.CommPort = PortNo    MSComm1.Settings = "115200,n,8,1"    MSComm1.InputMode = comInputModeText    MSComm1.InBufferCount = 0    MSComm1.OutBufferCount = 0    MSComm1.RThreshold = 1    MSComm1.PortOpen = True    MSComm1.InputLen = 0End SubPrivate Sub Command1_Click()    If MSComm1.PortOpen = True Then        m_Mode = 1        result = vbNullString        MSComm1.InBufferCount = 0        MSComm1.Output = vbLf & "r?"    End IfEnd SubPrivate Sub Command2_Click()    If MSComm1.PortOpen = True Then        m_Mode = 2        result = vbNullString        MSComm1.InBufferCount = 0        MSComm1.Output = vbLf & "t?"    End IfEnd SubPrivate Sub MSComm1_OnComm()    If (MSComm1.CommEvent = comEvReceive) Then        result = result & MSComm1.Input        Select Case m_Mode            Case 1: Frequency.Text = result            Case 2: Temp.Text = result        End Select    End IfEnd Sub
[解决办法]
探讨
----问题如下----:
(1)点击命令1的话,Frequency.txt 为空白;再按一次,正常了;
(2)点击命令2的话,Temp.txt 显示的是命令1的频率信息;然后再点击一下命令2,这时Temp.txt 显示正常;

读书人网 >VB

热点推荐