vb 如何把串口通信接收到的byte转换成数值
vb写了一个串口接收程序,接收方式为二进制,我看网上很多例子都是存到byte类型的数组里然后再转换成字符串,这不是我想要的,我想把他转换成0-255的数值,(不要转成字符...
vb写了一个串口接收程序,接收方式为二进制,我看网上很多例子都是存到byte类型的数组里然后再转换成字符串,这不是我想要的,我想把他转换成0-255的数值,(不要转成字符再转成ascii码的办法)
下位机端每50毫秒发一次数据,每次发128个字符的数组,我想到两方案
方案一,RThreshold=1, 把每个oncomm收到按顺序的存在数组里
方案二,RThreshold是动态的,下位机端在128个字符前加个0xff ,首先rthreshold=1 如果接受到的值为0xff,则立即把RThreshold改为一128 然后接受整个数值,下一个oncomm事件则把收到的东西直接付给128个字符的数值再处理, 这样想有道理吗,我这样想的原因是如果一个一个收,每个oncomm事件的间隔很短(波特率115200),而且每个oncomm事件都要处理一些事情,会不会一个oncomm正在运行并且没运行完,下一个oncomm又来了 ,这样会不会把上一个oncomm事件的运行打断,会丢数据吗,我在网上看有人说加起始字符或停止字符,但是不知道怎么具体实现,我想实现上位机和下位机同步,下位机50毫秒发一次128个字符,上位机128个全收到时处理一个大事件(机处理起来耗时)然后等待下次接受,怎么实现啊 展开
下位机端每50毫秒发一次数据,每次发128个字符的数组,我想到两方案
方案一,RThreshold=1, 把每个oncomm收到按顺序的存在数组里
方案二,RThreshold是动态的,下位机端在128个字符前加个0xff ,首先rthreshold=1 如果接受到的值为0xff,则立即把RThreshold改为一128 然后接受整个数值,下一个oncomm事件则把收到的东西直接付给128个字符的数值再处理, 这样想有道理吗,我这样想的原因是如果一个一个收,每个oncomm事件的间隔很短(波特率115200),而且每个oncomm事件都要处理一些事情,会不会一个oncomm正在运行并且没运行完,下一个oncomm又来了 ,这样会不会把上一个oncomm事件的运行打断,会丢数据吗,我在网上看有人说加起始字符或停止字符,但是不知道怎么具体实现,我想实现上位机和下位机同步,下位机50毫秒发一次128个字符,上位机128个全收到时处理一个大事件(机处理起来耗时)然后等待下次接受,怎么实现啊 展开
4个回答
展开全部
淡定!IT界的先生们...
我理解您的问题是:想把接收到的二进制数转换为数值型(整数或小数)... 所以我认为在处理接收到的字节型数据时应该如下:
1、要知道接收到的字节数据,在什么位置分段。也就是说,当对方在不断的发数据时候,整个发送数据流是连续不断的,要明确所发数据流的结构。
如:
"S0025N567" 这样的字符串发送过来,双方已经约定好了,见到"S"表示序号,后面的四位数据就是序号的值,见到"N"就是表示其测量的数值。这样就好办了,在接收数据的时候,虽然收到的是一串二进制数,但通过其约定的特殊字符就能拆分需要的数据了。
2、明确了双方的数据结构,在数据处理中就是处理方法的问题,应该没什么难处理的了。
(1)、16进制的字节转换成整数
Val(&Hxx) xx 表示16进制的字符型数据
所以你的 tmp = a(0) 出现错误正常.
这样写就正确了: tmp=val(chr(a(0))
如果a()表示的整个数字,应该写成:
tmp=Val(chr(a(0))+chr(a(1))+chr(a(3))+chr(a(4))+...)
这里需要你用 UBound(a) 来判断a() 的长度,确定到底加到那里,这里面已经包括出现小数的情况 .
(2)、 在利用OnComm事件进行接收数据时,注意保存中间数据。
虽然你的RThreshold参数设为1,由于电脑缓存及多任务的原因,接收的字符会出现不连续的可能,如:当前的OnComm() 事件中接收的是“S0025N5”,在下一个OnComm事件接收到的是"67",这些需要在程序中做处理.
希望我的思路能帮到你。有问题可以继续讨论...
我理解您的问题是:想把接收到的二进制数转换为数值型(整数或小数)... 所以我认为在处理接收到的字节型数据时应该如下:
1、要知道接收到的字节数据,在什么位置分段。也就是说,当对方在不断的发数据时候,整个发送数据流是连续不断的,要明确所发数据流的结构。
如:
"S0025N567" 这样的字符串发送过来,双方已经约定好了,见到"S"表示序号,后面的四位数据就是序号的值,见到"N"就是表示其测量的数值。这样就好办了,在接收数据的时候,虽然收到的是一串二进制数,但通过其约定的特殊字符就能拆分需要的数据了。
2、明确了双方的数据结构,在数据处理中就是处理方法的问题,应该没什么难处理的了。
(1)、16进制的字节转换成整数
Val(&Hxx) xx 表示16进制的字符型数据
所以你的 tmp = a(0) 出现错误正常.
这样写就正确了: tmp=val(chr(a(0))
如果a()表示的整个数字,应该写成:
tmp=Val(chr(a(0))+chr(a(1))+chr(a(3))+chr(a(4))+...)
这里需要你用 UBound(a) 来判断a() 的长度,确定到底加到那里,这里面已经包括出现小数的情况 .
(2)、 在利用OnComm事件进行接收数据时,注意保存中间数据。
虽然你的RThreshold参数设为1,由于电脑缓存及多任务的原因,接收的字符会出现不连续的可能,如:当前的OnComm() 事件中接收的是“S0025N5”,在下一个OnComm事件接收到的是"67",这些需要在程序中做处理.
希望我的思路能帮到你。有问题可以继续讨论...
更多追问追答
追问
帮我看看我补充的问题 谢谢啦
追答
关于串口中RThreshold 属性的设置问题,我想谈一下我的经验:
1、在VB 的串口控件中,设置RThreshold=1 原本的思路是:当接收缓冲区接收到一个字节时,就启动OnComm() 事件,当设置RThreshold=128 ,意思就是当缓冲区接收满128个字节时启动OnComm()事件。从实际的使用情况来看,这些条件及设计的思路好象都没有错,但在使用的时候往往编写的程序处理结果让程序员不是百分之百的满意,其主要的原因在于电脑是一个多任务的系统,且在处理串口数据的时候可能发生并发因素,数据在传送的时候可能形成扎堆的情况,有时候是流畅的结构数据,有时候就是扎堆的半结构数据。比如说:你定义好的128个字节数据块,在发送的时候是按块一个一个地发送的,但当接收的时候就不一定了,如果线路畅通,那一般没有问题,接收的也是一个128字节块,当线路不畅,接收的可能就是一部分...
2、要保证接收到的数据字节正确,需要定义一个全程字节变量 recvBtye(),
在进行正式接收前,清除 recvByte() 数据
仍然设置 RThreshold=1
在OnComm() 事件中处理接收数据
dim tmpByte() As Byte '临时数据
tmpByte=msComm.Input '读缓冲区数据
'当前接收到的字节和前面未处理的字节合成
recvByte=recvByte + tmpByte '这是逻辑表达方法,非程序哦.
如果 recvByte 的字节数超过128个字节,处理前128个字节,
循环判断是否还超过128个字节。
将剩余的字节继续保存到 recvByte
收到的字节不满足128个,暂时保存到 recvByte 等待下次继续
程序按照这样的逻辑处理应该是完满的,你可以再思考一下....
展开全部
晕死了~ 收到的不就是一串Byte嘛,全都是0-255的数值。不用转。
你是不是自己想迷糊了?不管是几进制,1就是1,2就是2。
有两个苹果,10进制是2个,2进制是10个,但它不就是俩苹果嘛!
虽然表示方法不同,“一共俩苹果”是不变的。
同样一个Byte的2和一个Integer的2也是一样的, 没有任何区别。
你是不是自己想迷糊了?不管是几进制,1就是1,2就是2。
有两个苹果,10进制是2个,2进制是10个,但它不就是俩苹果嘛!
虽然表示方法不同,“一共俩苹果”是不变的。
同样一个Byte的2和一个Integer的2也是一样的, 没有任何区别。
更多追问追答
追问
可是再赋值给integer ,会报错类型不匹配
而且得到的byte()中的值和别的数一起运算都会报错,类型不匹配,
追答
那是因为你收到的是一个 Byte(),这是个数组,一长串数字。怎么能赋值给Integer呢?
你得从其中取出一个。比如 N = Buf(0)
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Private Sub MSComm1_OnComm()
Dim dd() As Byte, i%
Dim iTime As Double
Select Case MSComm1.CommEvent
Case comEvReceive ' 收到 RThreshold # ofchars.
i% = MSComm1.InBufferCount
ReDim dd(i% + 1)
dd = MSComm1.Input
Call RecvBufAdd(dd, i%) '处理接收串口数据
end select
Dim dd() As Byte, i%
Dim iTime As Double
Select Case MSComm1.CommEvent
Case comEvReceive ' 收到 RThreshold # ofchars.
i% = MSComm1.InBufferCount
ReDim dd(i% + 1)
dd = MSComm1.Input
Call RecvBufAdd(dd, i%) '处理接收串口数据
end select
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
串口是什么,端口吗
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询