首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

vb串口数据转换有关问题

2012-02-07 
求助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代表的是寄存器个个数,每个寄存器包含两个字节,协议中应该指定来每个自己的含义啊!

热点排行