高手们你们好:
     我的问题是这样子的:“我用了一台我公司生产的9928未接触读卡机来读磁卡。我用WINDOWS操作系统自带的”超级终端“对这台读卡机进行设置。我把这台读卡机设置在了COM1接口上,它的波特率是9600,其他设置也正确,在每次读卡机读不同的卡时,”超级终端”程序都能自动的显示不同的磁卡数据。
     我在Delphi中正确的安装了免费串口通信控件SPComm,我想把读卡机每次所读的数据都显示在Form1窗体的Memo1控件里。为此,我在SPComm控件的OnReceiveData
事件里写了如下代码:procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer:  pointer; BufferLength: Word);
var
   strreceive:string;
begin
   setlength(strreceive,bufferlength);
   move(buffer^,pchar(strreceive)^,bufferlength);
   memo1.lines.add(strreceive);
   memo1.invalidate;
end;在程序运行时我打开了SPCOMM控件。   请问::??????程序运行时,Memo1中怎么不能显示缓存区里的数据???我的代码错了吗?
   请你们指教一下我在线等待你们。

解决方案 »

  1.   

    有时候,串口接收到的数据是不可显示字符所以没办法显示。
    可以转换为十六进制字符串显示:unit Routine;interfaceuses
      SysUtils;  //将十六进制字节转换为字符
      function HexToChar(const HexStr: string): Char;
      //将字符转换为十六进制字节
      function CharToHex(const C: Char): string;
    implementationfunction HexToChar(const HexStr: string): Char;
    var
      Num: Byte;
    begin
      Num := 0;
      case Ord(HexStr[1]) of
      Ord('0'): Num := 0 * 16;
      Ord('1'): Num := 1 * 16;
      Ord('2'): Num := 2 * 16;
      Ord('3'): Num := 3 * 16;
      Ord('4'): Num := 4 * 16;
      Ord('5'): Num := 5 * 16;
      Ord('6'): Num := 6 * 16;
      Ord('7'): Num := 7 * 16;
      Ord('8'): Num := 8 * 16;
      Ord('9'): Num := 9 * 16;
      Ord('A'): Num := 10 * 16;
      Ord('B'): Num := 11 * 16;
      Ord('C'): Num := 12 * 16;
      Ord('D'): Num := 13 * 16;
      Ord('E'): Num := 14 * 16;
      Ord('F'): Num := 15 * 16;
      end;
      case Ord(HexStr[2]) of
      Ord('0'): Num := Num + 0;
      Ord('1'): Num := Num + 1;
      Ord('2'): Num := Num + 2;
      Ord('3'): Num := Num + 3;
      Ord('4'): Num := Num + 4;
      Ord('5'): Num := Num + 5;
      Ord('6'): Num := Num + 6;
      Ord('7'): Num := Num + 7;
      Ord('8'): Num := Num + 8;
      Ord('9'): Num := Num + 9;
      Ord('A'): Num := Num + 10;
      Ord('B'): Num := Num + 11;
      Ord('C'): Num := Num + 12;
      Ord('D'): Num := Num + 13;
      Ord('E'): Num := Num + 14;
      Ord('F'): Num := Num + 15;
      end;
      Result := Chr(Num);
    end;function CharToHex(const C: Char): string;
    var
      High,Low: Integer;
      CharCode: Integer;
    begin
      CharCode := Ord(C);
      High := CharCode div 16;
      Low := CharCode mod 16;
      SetLength(Result,2);
      case High of
      10: Result[1] := 'A';
      11: Result[1] := 'B';
      12: Result[1] := 'C';
      13: Result[1] := 'D';
      14: Result[1] := 'E';
      15: Result[1] := 'F';
      else Result[1] := IntToStr(High)[1];
      end;
      case Low of
      10: Result[2] := 'A';
      11: Result[2] := 'B';
      12: Result[2] := 'C';
      13: Result[2] := 'D';
      14: Result[2] := 'E';
      15: Result[2] := 'F';
      else Result[2] := IntToStr(Low)[1];
      end;
    end;end.
      

  2.   

    procedure TFm_Main.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
    var
      Rec:PChar;
    begin
      GetMem(Rec,BufferLength+2);
      StrCopy(Rec,Buffer);
      Memo1.Lines.Add(Rec);
      

  3.   

    http://218.56.11.178:8020/web/index.aspx->下载基地->九品御厨作品-串口通讯控制器spcom事例程序还有相关控件