vb MSComm1控件连接HF-50推拉力计通讯失败,求高手解决有代码
COM2接口通讯MSComm2控件连接HF-50推拉力计(使用COM2口),连接不上,通讯失败.如下是代码.请查看.附档通讯协议.
Private Sub MSComm2_OnComm()
dataByte2 = MSComm2.Input
dataValue2 = 0#
bytLen2 = UBound(dataByte2)
For bytInd2 = 0 To bytLen2
byteVal2 = dataByte2(bytInd2)
If (byteVal2 = &H55) Then
If (codInd2 = 16) Then
If (codeByte2(0) = &H55) Then
dataValue2 = (codeByte2(6) - &H30) * (16 ^ 4) + (codeByte2(8) - &H30) * (16 ^ 3) + (codeByte2(10) - &H30) * (16 ^ 2) + (codeByte2(12) - &H30) * 16 + codeByte2(14) - &H30
'dataValue2 = dataValue2 / 1000
If (codeByte2(4) = &H2D) Then
dataValue2 = 0 - dataValue2
End If
'Jimmy adding 2011-6-22 for offset the right meters
' dataValue2 = dataValue2 + 28
End If
End If
codInd2 = 0
End If
codeByte2(codInd2) = byteVal2
codInd2 = codInd2 + 1
Next bytInd2
End Sub
测试连接失败。Communications not working
Private Sub Zero2_Click()
Zero1.Enabled = False 'dont allow simultaneous cal
Timer1.Enabled = False
X = 0
Do While Trim(Left(TabPull.MSComm2.Input, 7)) <> "N-MODE"
TabPull.MSComm2.Output = "F"
TabPull.Wait (1)
TabPull.MSComm2.Output = "S"
TabPull.Wait (1)
X = X + 1
If X > 5 Then Exit Do
Loop
TabPull.MSComm2.Output = "S"
TabPull.Wait (1)
Mode2.Text = Trim(Left(TabPull.MSComm2.Input, 7))
If X < 6 Then
Timer1.Enabled = True
TabPull.Wait 3
TabPull.MSComm2.Output = "Z"
ComErr2.Caption = " Communications OK "
Else
ComErr2.Caption = " Communications not working "
End If
Zero1.Enabled = True
End Sub
1. RS-232通讯协议
物理层:波特率2400bps
无奇偶校验
数据位:8位 1个停止位
通讯协议流程
① PC机或者PLC先向测力计(下位机)发送一个OX65
② 下位机按照以下格式(规约)向上位机传送数据
2. 传输力值的数据格式
cpu到pc:55 01 符号 数据
说明:55是握手
符号2B为正,2D为负
数据为3a,3b,3c,3d,3e的格式,此时力值是a*16^4+b*16^3+c*16^2+d*16+e
实际发送的是10进制数,请用串口调试观察数据
--------------------编程问答-------------------- http://download.csdn.net/detail/veron_04/1262066 --------------------编程问答-------------------- 其实串口通信很容易的,关键就是要研究明白通信协议即可,这个通信协议非常简单。很容易做的 --------------------编程问答-------------------- 以下连接为原代码. MSCOMM1,MSCOMM2使用两个控件连接设备. MSCOMM2连接HF-50推拉力计,目前通讯失败.
窗体ManualControl检查是否连接OK,目前点击"Zero2",会"Communications not working",
窗体TabPull是MSCOMM1,MSCOMM2控件代码.
http://download.csdn.net/detail/hnwjf322/4741227
以下还请高帮忙查看一下原因.
--------------------编程问答-------------------- Input 属性
返回并删除接收缓冲区中的数据流。该属性在设计时无效,在运行时为只读。
InputLen 属性确定被 Input 属性读取的字符数。设置 InputLen 为 0,则 Input 属性读取缓冲区中全部的内容。
InputMode 属性确定用 Input 属性读取的数据类型。如果设置 InputMode 为 comInputModeText,Input 属性通过一个 Variant 返回文本数据。如果设置 InputMode 为 comInputModeBinary,Input 属性通过一个 Variant .返回一二进制数据的数组。
数据类型
Variant
Trim(Left(TabPull.MSComm2.Input, 7))
过程返回的值在这次使用之后就丢弃了,下次再次调用怕是会混乱了.
自己维护缓冲区吧.要不就等mscomm.inputlen大于7在调用,要不就用rthreadhold和事件
补充:VB , 控件