我用的读卡器是非接触式的Korlta的读卡器,读卡器的型号是:KET101UE
试了一张卡,卡上标识为:0015000700  228,58492
技术人员说后八位是卡号,传速率:96000bs,无校验位,发送数据的方式是:起始符 地址字节 卡号 结束字符
是以ASCII码的形式发送的,但我读了N次,读出来的数据为:000800E4E47C74
第三方控件是:ComPort.v3.0
源程序如下:
var
  Form1: TForm1;
  comport1:TCustomComPort;
implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
  coms:string;
begin
 // EnumComPorts(ComboBox1.Items);
  comport1.ReadStr(coms,20);//读取数据
  memo1.Lines.add(coms);
  comport1.ClearBuffer(true,false);
end;procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  comport1.Free;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
  comport1.ShowSetupDialog;//设置参数,打开串口
  comport1.Open;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
  comport1:=tcustomcomport.Create(self);
end;procedure TForm1.Button3Click(Sender: TObject);
begin
  comport1.Close;
end;end.
不知道我读来的数据有没有错误,如果哪位大侠有正确的从串口读数据的例子,可以发给我吗?谢谢,,因为学校还在上课,所以有的时候会不在线的,请原谅!!先出50分,搞定了再加100,我可用分有2600多分,

解决方案 »

  1.   

    你读出的数据似乎不完整
    0015000700-------->16进制:E4E47C
    而你读出的是 0008 00E4E47C 74,所以,应该是读出的数据不完整,没读出卡号,只把标识读出来了。
      

  2.   

    分析清楚了,你读的正确,而是技术人员说错了。
    协议不传输卡号,只传输了标识。00 08 00E4E47C 7400:起始符 
    08:地址字节长度,标识后面有8个字节长度数据
    00E4E47C:卡号,10进制就是0015000700
    74: 结束字符
      

  3.   

    comport1.ReadStr(coms,20);//读取数据20 是什么意思?? 20位??
      

  4.   

    “传速率:96000bs”
    是写错了么?是9600bps么?
      

  5.   

    是的,20位,不好意思,是9600bps
    因为我是直接设置好的,
      

  6.   

    ComPort 中有Readchar..事件(自动触发),你在那里读数据,这样才会完整。否则有可能会丢数据。