利用spcomm读取磅秤数据,
波特率:1200
停止位:1
无校验
数据位:8function 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中就不对了

解决方案 »

  1.   

    这应该是传过来的数据不规则吧?你直接打印出来接收到的数据看看
    SetLength(Str1, BufferLength); //接收RS232的数据并显示Memo1上。
    Move(Buffer^, PChar(Str1)^, BufferLength);
    writeLog('从串口接收到数据:' + Str1);
      

  2.   

    可以考虑在接收后去掉空格、回车换行符,然后通过定位wn、kg来截取出来合法的数据项
      

  3.   

    修改你的SpComm.pas,检查其中的InputBufferLength,看看是不是跟你需要的长度一致
      

  4.   

    接收的时候sleep    
      

  5.   

    怎么才知道InputBufferLength和我要的一致呢?
      

  6.   


    s:=trim(s);
    s:=AnsiReplaceStr(s,'g','g'+#13#10);
    memo1.text:=memo1.text+s;
    就是个字符串拼接的问题。串口就是串行的数据, spcomm怎么知道你哪些数据是要拼在一起的? 拼接的工作当让要你自己来做
      

  7.   


    我08年写过这种程序,spcomm就是这个毛病,我那个时候用spcomm,不接收2k数据他不停。
    用 CommPortDriver,虽然也会多接收一些,不过你可以抛弃后面的数据,1秒种接收6、7组应该没问题。