读书人

spcomm接收数据,该如何处理

发布时间: 2012-02-12 17:16:33 作者: rapoo

spcomm接收数据
利用spcomm读取磅秤数据,
波特率:1200
停止位:1
无校验
数据位:8

function HexStrToStr(const S:string):string;
var
t:Integer;
ts:string;
M,Code:Integer;
begin
t:=1;
Result:='';
while t<=Length(S) do
begin
while (t<=Length(S)) and (not (S[t] in ['0'..'9','A'..'F','a'..'f'])) do
inc(t);
if (t+1>Length(S))or(not (S[t+1] in ['0'..'9','A'..'F','a'..'f'])) then
ts:='$'+S[t]
else
ts:='$'+S[t]+S[t+1];
Val(ts,M,Code);
if Code=0 then
Result:=Result+Chr(M);
inc(t,2);
end;
end;
procedure TFrmMain.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i,k:integer;
s, str1:string ;
begin
SetLength(Str1,BufferLength);
move(buffer^,pchar(Str1)^,bufferlength);
if length(trim(Str1)) <= 0 then Exit;
for i := 1 to length(Str1) do
s := s + inttohex(ord(Str1[i]), 2);
Memo1.Lines.Add(HexStrToStr(s));
Edit1.text:=HexStrToStr(s); //此处显示到edit中不对
end;

收到的数据显示在memo中为:
wn00004.5k
g
wn000
4.3kg
wn00004.2kg
类似这样的数据。我需要
wn00004.5kg
wn00004.3kg
wn00004.2kg
这样的数据。
如果像上面那种情况的话显示到edit中就不对了



[解决办法]
这应该是传过来的数据不规则吧?你直接打印出来接收到的数据看看
SetLength(Str1, BufferLength); //接收RS232的数据并显示Memo1上。
Move(Buffer^, PChar(Str1)^, BufferLength);
writeLog('从串口接收到数据:' + Str1);
[解决办法]
可以考虑在接收后去掉空格、回车换行符,然后通过定位wn、kg来截取出来合法的数据项
[解决办法]
这跟你的串口参数有关,在不同的机器上要调试,因为机器环境和性能的不一样,参数也可能不一样,你这可能是延时引起的,其他参数也要试着调节一下,另外,接受的数据,先放到一个列表,后台开一个线程对列表进行处理,不要把解析的代码一些到接收处,这样容易丢数据
[解决办法]
修改你的SpComm.pas,检查其中的InputBufferLength,看看是不是跟你需要的长度一致
[解决办法]
接收的时候sleep
[解决办法]

Delphi(Pascal) code
s:=trim(s);s:=AnsiReplaceStr(s,'g','g'+#13#10);memo1.text:=memo1.text+s;
[解决办法]
你一接受就处理一下吧,数据之间肯定有时间间隔的,在间隔里处理这些字符串的转换

读书人网 >.NET

热点推荐