100分征集算法 (100分)

  • 主题发起人 主题发起人 lsgd1688
  • 开始时间 开始时间
L

lsgd1688

Unregistered / Unconfirmed
GUEST, unregistred user!
从串口收到的数据,格式如下:
数据头 0x88
以0x68 0xFF 结尾
数据流如下:0x88 Byte1 Byte2 0x68 0xFF 0x88 Byte1 Byte2 0x68 0xFF 0x88 Byte1 Byte2 0x68 0xFF 0x88 Byte1 Byte2 0x68 0xFF .....
要求能正确提取出Byte1 Byte2,要考虑到误码,即中间会有传错的时候,如有可能出现:
0x88 Byte1 Byte2 0x68 0xFF Byte2 0x68 0xFF 0x88 Byte1 0xFF ....
系统实时性要求较高,不允许大量回溯
我对算法研究甚少,望各位富翁相助
 
+++
从串口收到的数据可以放到字符串里,
搜索头or尾特征,
然后判断对错(可用长度或其它条件),
正确的数据取出处理后移出,
继续搜索头or尾特征
错误的数据根据情况处理(移出or保留部分) 然后继续搜索头or尾特征
直到完成。
+++
也可找一控件用特征字符作中断处理。
+++
我觉得用ASCII传输CRLF结尾较好处理。
 
var str:string;
在接收数据的位置添加代码:
str:=str+'接收到的数据';
处理str;
var begin
Pos,EndPos:integer;
TargetStr:string;
while length(Str)>0do
begin
EndPos:=pos(Str,(chr($68)+chr($FF)));
//取出第一个结束标志的位置
TargetStr:=copy(str,1,EndPos+2);
//将这段数据取出
Delete(Str,1,EndPos+2);
//将这段数据从字符串中删除
if TargetStr[1]=chr($88) then
//如果取出的数据首位为开始标志
begin
... //处理这个串吧。
end;
end;

仅仅是个算法的趋型,你自己体会一下,如还有问题,可上QQ找我 584740
 
多人接受答案了。
 
后退
顶部