spcomm读取到ACSCII如何转换成十进制 ( 积分: 100 )

  • 主题发起人 主题发起人 nhlong320
  • 开始时间 开始时间
N

nhlong320

Unregistered / Unconfirmed
GUEST, unregistred user!
我做了一个读卡系统它读的码子正确,若读取一张卡显示02 31 41 32 42 , 可是我是用的spcomm,怎样才能让它转换显示为十进制的6432,其中02表示空格不用管,小生笨,请大侠救我!最好能给我写段源代码实现,可以发到我的邮箱nhlong320@163.com
源程序在下:procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i,j:integer;
Hex:integer;
viewstring,wiewstring:string; //串口接受字符串
rbuf,sbuf:array[1..5] of byte; //信息所占缓存
begin
button2.Visible:=false;
viewstring:='';
for i:=1 to 5 do
begin
rbuf:=0;
end;
move(buffer^,pchar(@rbuf)^,5); //Copies bytes from a source to a destination.
for i:=1 to 5 do
begin
viewstring:=viewstring+inttohex(rbuf,2)+' ';
sbuf:=hextoint(viewstring);
end;
viewstring:='接受'+viewstring;
memo1.lines.add(viewstring);
//memo2.lines.add()///////在它当中加入十进制6432
 
我做了一个读卡系统它读的码子正确,若读取一张卡显示02 31 41 32 42 , 可是我是用的spcomm,怎样才能让它转换显示为十进制的6432,其中02表示空格不用管,小生笨,请大侠救我!最好能给我写段源代码实现,可以发到我的邮箱nhlong320@163.com
源程序在下:procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i,j:integer;
Hex:integer;
viewstring,wiewstring:string; //串口接受字符串
rbuf,sbuf:array[1..5] of byte; //信息所占缓存
begin
button2.Visible:=false;
viewstring:='';
for i:=1 to 5 do
begin
rbuf:=0;
end;
move(buffer^,pchar(@rbuf)^,5); //Copies bytes from a source to a destination.
for i:=1 to 5 do
begin
viewstring:=viewstring+inttohex(rbuf,2)+' ';
sbuf:=hextoint(viewstring);
end;
viewstring:='接受'+viewstring;
memo1.lines.add(viewstring);
//memo2.lines.add()///////在它当中加入十进制6432
 
你读的是什么卡啊,不同类型的卡,其卡号组成方式也是有所不同的啊
 
我用的远距离射频卡,读取到的信号是真确的31 39 32 30,我是在把它转换成十进制数6432时被搞糊涂了,请大侠多多指教,最好能给我写点源代码,我用了很多方法都行不通
 
这是把16进制每1位转成ASCII码了:
31 39 32 30 分别是数字 1 9 2 0 的ASCII码,十六进制1920等于十进制的6432
 
大侠,请您用程序给我解释我会更加感激您的!小生笨,就是在这不会写程序了
 
想问一下,你是不是要把31 41 32 42 这四个字节转成int型吗?
你把这四个字节取出来付给一个数组:
Buff[0]:=42;Buff[1]:=32;Buff[2]:=41;Buff[3]:=31;
.......
Integer(Buff);
 
最后这么写:
viewstring:='$';
for i:=2 to 5 do
begin
viewstring:=viewstring+chr(rbuf);
end;
Memo2.Lines.Add(IntToStr(StrToInt(viewstring)));
 
还是不行[:(]
 
不可能不行的,除非你收到的不是你说的数据。
到底怎么个不行法?
 
nhlong320
对方是以ASCII方式发送的??那么你收到的每个byte就是一个码,不可能是02 31 41 32 42
如果你收到的是ASCII方式,转换成十进制应该先转化成字符char(rbuf,1)
但是你上面的做法明显是以16进制方式的,怎么回事??
 
如果你那里是16进制,那么你先把整个
for i:=1 to 5 do
begin
//viewstring:=viewstring+inttohex(rbuf,2)+' ';
viewstring:=viewstring+inttohex(rbuf,2)
//sbuf:=hextoint(viewstring);
end;
这样viewstring就是16进制数的字符表示出来了,再转换成10进制
Format('%2.2d',[StrtoInt('$'+viewstring)]);
就是该16进制表示的10进制书数了!
 
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i,j:integer;
Hex:integer;
viewstring,wiewstring:string; //串口接受字符串
rbuf,sbuf:array[1..5] of [red]char[/red]; //信息所占缓存
begin
button2.Visible:=false;
viewstring:='';
for i:=1 to 5 do
begin
rbuf:=0;
end;
move(buffer^,pchar(@rbuf)^,5); //Copies bytes from a source to a destination.
for i:=2 to 5 do
begin
viewstring:=viewstring+rbuf;
//sbuf:=hextoint(viewstring);
end;
viewstring:=inttostr(StrToInt('$'+viewstring));
viewstring:='接受'+viewstring;
memo1.lines.add(viewstring);
//memo2.lines.add()///////在它当中加入十进制6432
 
x:=StrToInt('$'+char(rbuf[1])+char(rbuf[2])+char(rbuf[3])+char(rbuf[4]));
 
谢谢大家!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部