关于网友提出的“ Delphi串口双通道实时循环采集问题”问题疑问,本网通过在网上对“ Delphi串口双通道实时循环采集问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: Delphi串口双通道实时循环采集问题描述:
前几天发贴咨询Delphi串口采集问题,大家很热心,给予了我很大帮助。详见
http://topic.csdn.net/u/20090714/08/0afb0f58-8f6e-4962-a1b7-9e72101311c1.html?1651240418
我现在需要双通道实时循环采集,也就是数据是比如 12 34 22 34,这算是一组,其中12中的1代表1通道号,234代表数据。22中的2代表2通道号,234代表数据,如此循环。请问大家程序应该如何组织,谢谢!!!
解决方案1:
根据通信帧的格式来读取数据,比如你的一帧数据一共有多少个byte,
读出来放在一个盏中,比如ReSorceBuf: array [0..30] of Integer;
那么你的接收数据将是ReSorceBuf[0] := 1;ReSorceBuf[1] := 2;
ReSorceBuf[2] := 3;ReSorceBuf[3] := 4;
这样通过移位就可得出了。上面是高位在前,具体看你应用协议
tmp := ReSorceBuf[1] shl 16 + ReSorceBuf[2] shl 8 + ReSorceBuf[3];
tmp即为你收的一通道数据
根据通信帧的格式来读取数据即可。
解决方案3: 光通过1,2来区别通道是不够的,如果数据中也有1或者2的话就麻烦了,需要转义哦,
定义一下帧格式是有必要的
其实你的上个帖子里面已经有人讲得很清楚了
假设getarray为你接受的数据
getarray[0]:=#$12;
getarray[1]:=#$34;
getarray[2]:=#$22;
getarray[3]:=#$34;
lane:=(ord(getarray[2]) and $f0) shr 4; //取出高4位
edit1.Text:=inttostr(lane);
data:=inttohex((ord(getarray[2]) and $0f)*256+ord(getarray[3]),3); //取出数据
edit2.Text:=data;
lz的数据比如,这就不好确定了,因为数据格式要固定才好进行循环取数,如果格式发生了变化,那样处理起来就比较繁琐了。 解决方案6:
只要保证规则不变,那就循环取吧,4字节为一组,其中第一个为通道号,后三个为值
解决方案7: 那就不断接受,
用一个用与和右移把第一字节高四位搞出来做地址,放到对应的缓冲区