求助vb串口数据转换问题我使用VB6.0的MSCOMM控件与一个电压表通信,读取电压值,使用的是MODBUS协议。发送的
求助vb串口数据转换问题
我使用VB6.0的MSCOMM控件与一个电压表通信,读取电压值,使用的是MODBUS协议。
发送的查询命令是:01 04 00 34 00 04 B0 07
接收到的是: 01 04 08 43 C2 D9 4F 43 C1 92 5D 2D C2
已知电压表电压值在380V左右。我对接受到的第4-11数据做了处理,转换成Double输出,但是结果总是不正确。
我的代码如下:
- VB code
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" ( _ ByRef Destination As Any, _ ByRef Source As Any, _ ByVal Length As Long)Private Sub Form_Load() MSComm1.CommPort = 1 MSComm1.Settings = "9600,N,8,1" MSComm1.RThreshold = 13 MSComm1.InputLen = 0 MSComm1.SThreshold = 1 MSComm1.InputMode = comInputModeBinary MSComm1.PortOpen = True Text1.Text = ""End SubPrivate Sub MSComm1_OnComm() Dim InByte() As Byte Dim OutByte(0 To 7) As Byte Dim dou As Double Select Case MSComm1.CommEvent Case comEvReceive InByte = MSComm1.Input For I = LBound(InByte) To UBound(InByte) Buf = Buf + Str(InByte(I)) + Chr(32) Next I For t = 3 To 10 OutByte(t - 3) = InByte(t) Next t CopyMemory dou, OutByte(0), 8 Text9.Text = Buf Text10.Text = UBound(InByte) Text11.Text = LBound(InByte) Text12.Text = FormatNumber(dou, 2) End SelectEnd Sub
我感觉应该是转换方面做错了。是不是应该将中间的8个数据,合并为4个BYTE(高字节左移4位再与低字节相与),然后再转换为Singel类型的数据?
我是VB新手,对于VB的位操作和数据通信方面不太熟,请高手指点指点啊,先谢谢了
[解决办法]
“43 C2 D9 4F 43 C1 92 5D”
问:1.那边是最高位
2.满量程的值是全ff
3.在没有测量电压的状态下为 全0
[解决办法]
查了下
1)1 个寄存器 2 字节,所以发送命令的寄存器数只要 2 就可以了
发送 01 04 00 34 00 02 XX XX
2)而且是 Big-Endian 的,需要反序成 Little-Endian 的再转换成 Single
接收 01 04 04 43 C2 D9 4F XX XX
- VB code
Dim OutByte(0 To 3) As ByteDim v as single...For t = 0 to 3 OutByte(t) = InByte(6-t)NextCopyMemory v, OutByte(0), 4
[解决办法]
应该会有通讯协议给你的,你的是基于modbus协议的,格式肯定是按照modbus来的,我们想知道的是00 34 这个起始地址后面的4个单元中是否存放的就是电压值呢,而且返回的是8个数据,不知道是不是4代表的是寄存器个个数,每个寄存器包含两个字节,协议中应该指定来每个自己的含义啊!
