关于字符串处理(重谢200分)(200分)

  • 主题发起人 主题发起人 thermometer
  • 开始时间 开始时间
T

thermometer

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟从串口读入数据(string类型),格式
为4位字符(该4位字符可转换成int数据)
和一个结束标记字符‘#’。因为数据量很
大我可以分若干次接受的串数据,但串长度
不一,可能将一个可转换成int数据的4位
字符分成了两个串接受,比如A串的结尾
是#248,而紧跟A串后被接受到的B串的开头
是1#2355#,请教如何处理才可以得到所有数据
就是象2481这样的数据不被忽略掉?而且我还
要一边接受数据,一边处理(在一坐标系中显
示),不能设一个串等所有数据全接受到后再
处理。

P.S.小弟为一DELPHI菜鸟,对String的处理没
经验,请有意回答的朋友回答时尽量Paste代
码和注释,否则小弟可能看不懂,谢了!!!
 
可以用一个Comm控件, 循环读数据, 并将数据存放到一个缓冲区内,
而另一个线程可以只管对这个缓冲区进行扫描, 什么时候看到有#了, 就
处理#之前的数据. 大致如下:


buf: ===========================================
| |
last_end buf_end

存放总是从buf_end开始

处理总是从头开始, last_end表示第一个#出现的位置,
每次处理完成, 要将last_end~buf_end之间的数据move到头, 然后修改buf_end

设置一个lock标志位, 处理的时候和存放的时候分别lock一下, 完成后再unlock
而处理和存放之前要分别判断一下是否是lock状态.比如: save_lock=1, proc_lock=2,
unlocked=0;

if lock_var=unlocked then
begin
....
end;
 
可以这样做的,用temp1存放你从串口读到的字符串,temp2放要处理的字符串
code存放你要变为int的字符串
开始时
temp:='';
每次读到字符串时temp2:=temp1+temp2;
while strpos(temp2,'#')<>'' do //如果存在'#'处理它之前的四位字符
begin
code=copy(temp2,1,4);
temp2:=strpos(temp2,'#');
转化为整形,做你想要的操作;
end;//如果没有'#'等待后面字符串加入构成新的四位字符
从串口读字符串temp2:=temp1+temp2;

 
有特定的分隔符,很容易处理。可以采用以下算法:
S:='';
repeat
读入一个字符串 S1;
S:=S+S1;
Index:=Pos('#',S);
while Index>0 do
begin
NumS:=Copy(S,1,Index-1)
//将第一个数值串拷贝出来
处理(NumS)
//实际的处理过程
Delete(S,1,Index)
//删除已经处理的内容
Index:=Pos('#',S);
end;
//上面这个循环结束时,S或者为空,或者是最后一个不完整的串,留待下一循环与后面的串一起处理
until 结束条件

这个算法比较简单,不过因为不断地从S中删除处理过的内容,效率较低,但对于串行数据的处理
应该不会对实际应用有影响。
如果需要的话,可我也以贴一个高效一点的算法给你。
 
自己做一个函数,把读入字符串一个个的读。
放入一个栈。读到#号,把栈中的字符读出,转化成int。
进行操作。
做两个线程。一个处理读数据,一个进行数据处理。
应该捉的出来的。
 
接受答案
 
后退
顶部