串口收到数据后再转换的一个小问题(将十六进制转化为十进制的)

v20052008 2007-05-28 09:59:07
程序如下:
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??


???????

...全文
1956 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
笨狗先飞 2011-10-08
  • 打赏
  • 举报
回复
四年前的我...抢了2楼...
嗷嗷叫的老马 2011-10-07
  • 打赏
  • 举报
回复
膜拜一下楼上挖坟的......= =!
zdingyun 2011-10-06
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 alifriend 的回复:]
膜拜一下,一年的贴子还不结
[/Quote]
4年前的老帖了.
aini13141413 2011-10-05
  • 打赏
  • 举报
回复
是把第二个字符左移两位!!然后求和的。。。
波导终结者 2008-06-04
  • 打赏
  • 举报
回复
膜拜一下,一年的贴子还不结
麦田之兔 2008-06-04
  • 打赏
  • 举报
回复

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
AloneZHANG 2008-05-08
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 of123 的回复:]
你的疑问跟 VB 没什么关系,关键在于你传送进来的数据格式是如何定义的。
你说的 4 位是 2 个字节还是 4 个字节?是大字节序还是小字节序(高字节在前还是低字节在前)?

你把这些说清楚了,一切迎刃而解。
[/Quote]
一样的看法
v20052008 2007-06-02
  • 打赏
  • 举报
回复
谢谢各位 在实验室已经调试通过了

下周去现场 不知道他们还会提什么意见 希望能通过 若有问题 还得请大家伙帮帮忙










bitzl210 2007-06-01
  • 打赏
  • 举报
回复
Public ReceiveQb() As Byte '从串口收数
然后收数时
ReceiveQb = MSCsend.Input
直接收进来的就是10进制啊
bitzl210 2007-06-01
  • 打赏
  • 举报
回复
定义一个byte型数组从串口收数
那样直接从串口中收到的就是十进制啊
hanxiao6904 2007-06-01
  • 打赏
  • 举报
回复
我做过这个,是用的copymemory函数,我是将收到的数据放在数组里,然后转换的,我是4个字节的转换成浮点数,要将2个字节的转换成整数,就不用copymemory了
zdingyun 2007-05-31
  • 打赏
  • 举报
回复
MSDN解释:
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
  • 打赏
  • 举报
回复
原因就是需高低字节换位处理,给你一段调试正确的代码,下位机要发一个温度值 1F01,上位机收到后换位为011F:
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
v20052008 2007-05-31
  • 打赏
  • 举报
回复
现在感觉我出的悬赏分太少了 以为是个小问题 没想到会搞这么久
问题解决了一定增加分

我现在搞得是 :下位机是一个红外温度传感器测温系统 有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个字节,包括一堆其他的信息
kkkk17100 2007-05-31
  • 打赏
  • 举报
回复
api copymemory应该可以
of123 2007-05-30
  • 打赏
  • 举报
回复
你的疑问跟 VB 没什么关系,关键在于你传送进来的数据格式是如何定义的。
你说的 4 位是 2 个字节还是 4 个字节?是大字节序还是小字节序(高字节在前还是低字节在前)?

你把这些说清楚了,一切迎刃而解。
zdingyun 2007-05-30
  • 打赏
  • 举报
回复
xx22nn(redhill红岭山腰的程序员)
那我现在要转换的数据是四位十六进制的 就是BBBB 这个在vb里面应该怎么写啊
不是每个都要加乘一个16吧
text1.text=val("&H" & "BBBB")

你代码处理方式符合VB的要求。
麦田之兔 2007-05-30
  • 打赏
  • 举报
回复
那我现在要转换的数据是四位十六进制的 就是BBBB 这个在vb里面应该怎么写啊
不是每个都要加乘一个16吧
text1.text=val("&H" & "BBBB")

麦田之兔 2007-05-30
  • 打赏
  • 举报
回复
还是不懂啊 一般来说比如一个十六进制的数B5转化为十进制时为:5+11*16=181
要是5+11*256那两个结果肯定不一样啊
是vb语言的问题吗?
那我现在要转换的数据是四位十六进制的 就是BBBB 这个在vb里面应该怎么写啊
不是每个都要加乘一个16吧
------------------------
直接比如b5
text1.text=val("&H" & "B5")
也就是text1.text=data1(0) + data1(1))*&H10
没有错误!
zdingyun 2007-05-30
  • 打赏
  • 举报
回复
v20052008()
串口来的数据 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
加载更多回复(14)

7,765

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧