串口收到数据后再转换的一个小问题(将十六进制转化为十进制的)
时间:2007-05-28
来源:互联网
Dim Data(3) As Integer
Dim buffer As Variant
Private Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.Settings = "9600,n,8,1 "
MSComm1.InputMode = comInputModeBinary
MSComm1.RThreshold = 1
MSComm1.InputLen = 2
MSComm1.InBufferCount = 0
MSComm1.PortOpen = True
End Sub
Private Sub MSComm1_OnComm()
buffer = MSComm1.Input
For i = LBound(buffer) To UBound(buffer)
Data(i) = buffer(i)
Next i
Text1.Text = Data(0) + Data(1) * 16 '这里该怎么写啊?在文本框以十进制显示收到的数据
End Sub
根据观察结果 Text1.Text 显示的数据常常到3000多 肯定有问题啊 应该在0--256之间才对啊
应该怎么改啊 还是哪块设置有问题啊
另:我以前做项目的时候看到别人的一个程序是这么写的:Text1.Text = Data(0) + Data(1) * 16 * 16 为什么要两个*16??
???????
作者: v20052008 发布时间: 2007-05-28
可我不清楚啊
作者: v20052008 发布时间: 2007-05-29
作者: bakw 发布时间: 2007-05-29
要是5+11*256那两个结果肯定不一样啊
是vb语言的问题吗?
那我现在要转换的数据是四位十六进制的 就是BBBB 这个在vb里面应该怎么写啊
不是每个都要加乘一个16吧
作者: v20052008 发布时间: 2007-05-29
for i=1 to length
select case i
case 1
t1=16
case 2
t1=256
………
end select
data=data+t1*mid(receivedata,(length-i),1)
next i
作者: dx_cyb 发布时间: 2007-05-29
作者: zdingyun 发布时间: 2007-05-29
你那个公式有问题吧?data没有赋初值 也就是他的初值为零
这样的话 比如:收到的数据为ABCD 按你的算法推出来就是:C*16+B*256+A*4096
应该再加上D吧?
zdingyun() :
我现在串口来的数据是这样处理的,比如数据为:09 89 B2 CB 45 34 ...
我要两个合并 data1=十进制(0989)
data2=十进制(B2CB)
.......
用你的方法我发现当大于&H7FF时 它返回的就为负数了
这个怎么解决啊 ?
作者: v20052008 发布时间: 2007-05-29
用你的方法我发现当大于&H7FF时 它返回的就为负数了
这个怎么解决啊 ?
这是VB中INTEGER数据的值定义所致,你单片机中数据是如何组织的,需根据通信协议定,你要0-255只能每当个16进制来转换。
作者: zdingyun 发布时间: 2007-05-29
作者: zdingyun 发布时间: 2007-05-29
一般很多通信协议是按16位(二进制数据),范围为-32768到32767间,小数位数由通信协议指定,不传递.如TEX-200系列仪表V6.0串行通讯接口协议约定为::-2999—+32767为数据,用-32768—-7160之间的数值来表示地址代号,如果数据是温度值,其小数为1位,则数据在
-299.9—+3276.7范围.
所以你应确认数据通信的协议是如何规定的,再来决定你接收后的数据处理.不然我们在此妄加推测,可能导致错误理解.
作者: zdingyun 发布时间: 2007-05-29
要是5+11*256那两个结果肯定不一样啊
是vb语言的问题吗?
那我现在要转换的数据是四位十六进制的 就是BBBB 这个在vb里面应该怎么写啊
不是每个都要加乘一个16吧
------------------------
直接比如b5
text1.text=val( "&H " & "B5 ")
也就是text1.text=data1(0) + data1(1))*&H10
没有错误!
作者: xx22nn 发布时间: 2007-05-30
不是每个都要加乘一个16吧
text1.text=val( "&H " & "BBBB ")
作者: xx22nn 发布时间: 2007-05-30
那我现在要转换的数据是四位十六进制的 就是BBBB 这个在vb里面应该怎么写啊
不是每个都要加乘一个16吧
text1.text=val( "&H " & "BBBB ")
你代码处理方式符合VB的要求。
作者: zdingyun 发布时间: 2007-05-30
你说的 4 位是 2 个字节还是 4 个字节?是大字节序还是小字节序(高字节在前还是低字节在前)?
你把这些说清楚了,一切迎刃而解。
作者: of123 发布时间: 2007-05-30
作者: v20052008 发布时间: 2007-05-30
text1.text=data1(0) + data1(1))*&H10
-------------------------------
哦 我开始理解错了
作者: v20052008 发布时间: 2007-05-30
发上来的是温度的值 因为是16位的 每次发八位 所以我要把两次发的合并再取值
作者: v20052008 发布时间: 2007-05-30
Val( "&H " & "BBBB ")处理16进制方法是VB经典做法。
温度值数据16位,需依据通信协议来决定如何处理,温度有负值。
也有可能按BCD码构成,则直接取4字节16进制字符直接显示,范围为0000-9999
总之需依据通信协议来决定如何处理。
作者: zdingyun 发布时间: 2007-05-30
只要不超过范围
Val( "&H " & "高位 " & "低位 " & "更低位 "...)
作者: xx22nn 发布时间: 2007-05-30
串口来的数据 0989B2CB
低字节在前,需将接收到的数据字节换位:
Option Explicit
Dim data As String
Dim data1 As String
Private Sub Command1_Click()
data1 = Mid(data, 3, 2) & Mid(data, 1, 2)
Text2 = Val( "&H " & data1)
End Sub
Private Sub Form_Load()
data = "0989 "
Text1 = data
End Sub
作者: zdingyun 发布时间: 2007-05-30
问题解决了一定增加分
我现在搞得是 :下位机是一个红外温度传感器测温系统 有led点阵显示温度
每个温度值分两个字节发送
上位机用vb做个界面 显示温度
我昨天自己鼓捣出来的程序 显示是对的 但是我自己也不知道怎么回事 有些地方不理解 把主要部分贴出来 标出来的地方高手们给解释一下吧
Dim buffer As Variant
Dim Data(3) As Integer
Dim shi As Integer
Private Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.Settings = "9600,n,8,1 "
MSComm1.InputMode = comInputModeBinary
MSComm1.RThreshold = 1
MSComm1.InputLen = 2 '读取缓冲区的两个字符,
MSComm1.InBufferCount = 0
MSComm1.PortOpen = True
End Sub
Private Sub MSComm1_OnComm()
buffer = MSComm1.Input
text2.text=buffer '????text2.text显示的是一堆符号,怎么才能让它显示成现在
缓冲区的数据
For i = LBound(buffer) To UBound(buffer)
Data(i) = buffer(i)
shi = Data(0) + Data(1) * 16 * 16 ' '?????不懂,看别人的一个小程序是这么写的
Text1.Text = shi
next i
end sub
' ' '我自己也理解不了,但出来结果是对的。比如他下位机要发一个温度值0x011F他是分两次发的,每次发一个字节,先发1F,再发01,我现在只用上面的程序,也没有进行合并,text1直接显示的就是287,多次测试也是对的。(是MSComm1.InputLen = 2这个的关系吗??)
' '看懂的人士能给我注释一下吗?
' '谁有mscomm的msdn给我贴出来看看吧
' '唉,郁闷死,要是只做到这里就算了,关键是我还要继续往下进行啊,他要发多路信号,要发3到4个字节,包括一堆其他的信息
作者: v20052008 发布时间: 2007-05-31
Private Sub Form_Load()
'...初始化
MSComm1.CommPort = 1
MSComm1.Settings = "9600,n,8,1 " '...设置通讯参数
MSComm1.InputLen = 0
MSComm1.OutBufferCount = 0
MSComm1.RThreshold = 1
MSComm1.PortOpen = True '...打开串口
End Sub
Private Sub mscomm1_OnComm()
Dim card As String
Dim indata() As Byte
Dim BytesReceived() As Byte
Dim ReceiveLen As Byte
Dim i As Integer
Dim t As String
Select Case MSComm1.CommEvent
Case comEvReceive
MSComm1.InputMode = comInputModeBinary
Lblshow.Caption = "正在接收数据 "
MSComm1.InputLen = 0
ReceiveLen = MSComm1.InBufferCount '以二进制方式接收
ReDim indata(ReceiveLen - 1) As Byte
indata = MSComm1.Input
BytesReceived() = indata '将数据转入BYTE中
For i = 0 To UBound(BytesReceived) '显示结果以十六进制显示
If Len(Hex(BytesReceived(i))) = 1 Then
card = card & "0 " & Hex(BytesReceived(i))
Else
card = card & Hex(BytesReceived(i))
End If
Next
If Len(card) = 4 Then '接收7字节数据判断
card = Mid(card, 3, 2) & Mid(card, 1, 2) '高底字节换位
Text1.Text = Val( "&H " & card)
MSComm1.InBufferCount = 0 '清除接收缓冲区
End If
End Select
End Sub
作者: zdingyun 发布时间: 2007-05-31
InputLen 属性
设置并返回 Input 属性从接收缓冲区读取的字符数。
语法
object.InputLen [ = value]
InputLen 属性语法包括下列部分:
部分 描述
object 对象表达式,其值是“应用于”列表中的对象。
value 整型表达式,说明 Input 属性从接收缓冲区中读取的字符数。
说明
InputLen 属性的缺省值是 0。设置 InputLen 为 0 时,使用 Input 将使 MSComm 控件读取接收缓冲区中全部的内容。
若接收缓冲区中 InputLen 字符无效,Input 属性返回一个零长度字符串 ( " ")。在使用 Input 前,用户可以选择检查 InBufferCount 属性来确定缓冲区中是否已有需要数目的字符。
该属性在从输出格式为定长数据的机器读取数据时非常有用。
数据类型
Integer
InputLen 属性示例
该例子说明如何读取 10 个数据字符:
Private Command1_Click()
Dim CommData as String
' 确定一个10个字符的数据块。
MSComm1.InputLen = 10
' 读数据。
CommData = MSComm1.Input
End Sub
作者: zdingyun 发布时间: 2007-05-31
作者: kkkk17100 发布时间: 2007-05-31
作者: hanxiao6904 发布时间: 2007-06-01
那样直接从串口中收到的就是十进制啊
作者: bitzl210 发布时间: 2007-06-01
然后收数时
ReceiveQb = MSCsend.Input
直接收进来的就是10进制啊
作者: bitzl210 发布时间: 2007-06-01
下周去现场 不知道他们还会提什么意见 希望能通过 若有问题 还得请大家伙帮帮忙
作者: v20052008 发布时间: 2007-06-02
你的疑问跟 VB 没什么关系,关键在于你传送进来的数据格式是如何定义的。
你说的 4 位是 2 个字节还是 4 个字节?是大字节序还是小字节序(高字节在前还是低字节在前)?
你把这些说清楚了,一切迎刃而解。
一样的看法
作者: AloneZHANG 发布时间: 2008-05-08
buffer = MSComm1.Input text2.text=buffer '????text2.text显示的是一堆符号,怎么才能让它显示成现在 缓冲区的数据 For i = LBound(buffer) To UBound(buffer) Data(i) = buffer(i) shi = Data(0) + Data(1) * 16 * 16 ' '?????不懂,看别人的一个小程序是这么写的 Text1.Text = shi next i end sub
这个都不懂怎么处理字节数据,一个字节8位最大是256=16*16有什么不可理解的
Data(0)中的数几就是几 Data(1)中的数1代表256
作者: xx22nn 发布时间: 2008-06-04
作者: alifriend 发布时间: 2008-06-04
作者: aini13141413 发布时间: 2011-10-05
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28