现在需要把字符类型转换成16进制发送出去,不会啦,我用的是mscomm控件,谁能帮帮我啊,谢谢啦
现在需要把字符类型转换成16进制发送出去,不会啦,我用的是mscomm控件,谁能帮帮我啊,谢谢啦
以下是字符/16进制和16进制/字符的源程序.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, XPMan;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
XPManifest1: TXPManifest;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); //字符转换/16进制(汉字和其他任何字符均可)
var
i,o:integer;
begin
edit2.text:= '';
for i := 1 to Edit1.GetTextLen() do
begin
o := Ord(Edit1.Text[i]);
edit2.text:= edit2.text + IntToHex(o, 2);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);//16进制/字符
var
i,n:integer;
c,c1:string;
begin
try
edit1.text:='';
n:=1;
for i := 1 to Edit2.GetTextLen()div 2 do
begin
c:=copy(edit2.Text,n,2);
n:=n+2;
c1:=c1+CHR(StrToInt('$'+C));
end;
edit1.Text:=c1;
except
on EConvertError do showmessage('内码数据输入有误!');
end;
end;
procedure TForm1.Button3Click(Sender: TObject);//清空数据
begin
edit1.text:='';
edit2.text:='';
end;
end.
[此贴子已经被作者于2006-9-26 23:40:19编辑过]
我把你那个字符转16进制的验证了一下,不对劲呀,例如我写1,结果转成31了,这是1的ASCII码吧。可能是我没说明白,例如我想让下位机接收到10(0AH,下位机接收单元显示16进制,例如发送字符1后显示0031),我PC机该怎么发送才能让它收到对应的数据呢?书上说要把数据用Byte类型发送,我就编了一个,结果还是不可以,再帮我看看吧
procedure TForm1.Button3Click(Sender: TObject);
var
Sendvar:Variant;
Ch1,Ch2:Char;
Byte1,Byte2:Byte;
I:Integer;
begin
Sendvar:=VarArrayCreate([1,Length(edit1.Text) div 2],varByte);
Byte1:=0;
Byte2:=0;
for I:=1 to Length(edit1.Text) div 2 do
begin
Ch1:=edit1.Text[2*I-1];
Ch2:=edit1.Text[2*I];
if (ord(Ch1)>=ord('0')) and (ord(Ch1)<=ord('9')) then
Byte1:=Ord(Ch1)-48
else if (ord(Ch1)>=ord('a')) and (ord(Ch1)<=ord('f')) then
Byte1:=Ord(Ch1)-87
else if (ord(Ch1)>=ord('A')) and (ord(Ch1)<=ord('F')) then
Byte1:=Ord(Ch1)-55;
if (ord(Ch2)>=ord('0')) and (ord(Ch2)<=ord('9')) then
Byte2:=Ord(Ch2)-48
else if (ord(Ch2)>=ord('a')) and (ord(Ch2)<=ord('f')) then
Byte2:=Ord(Ch2)-87
else if (ord(Ch2)>=ord('A')) and (ord(Ch2)<=ord('F')) then
Byte2:=Ord(Ch2)-55;
Sendvar[I]:=Byte1*16+Byte2;
end;
Form1.MSComm1.Output:=Sendvar;
end;
[此贴子已经被作者于2006-9-29 23:53:35编辑过]
byte类型属于整数类型,而你要发送的16进制数字在delphi中是以string类型存储的.所以不行.另外直接一10进制发送不是更简单一些吗?为什么要转换成16进制发送.
我这个程序是把字符变量转为字节变量发送出去(给DSP),如果不转化的话,发送的是字符,例如字符1,DSP收到0031,这不是我想要的结果;但是转化为字节变量的话,我在发送字符01,DSP就能收到01了,昨天我又试了下这个程序,只是适用2个字符的情况好用,大概再改一下就可以了,我确实没说明白,呵呵,下面我把这个程序解释一下
procedure TForm1.Button3Click(Sender: TObject);
var //定义变量类型
Sendvar:Variant;
Ch1,Ch2:Char;
Byte1,Byte2:Byte;
I:Integer;
begin
Sendvar:=VarArrayCreate([1,Length(edit1.Text) div 2],varByte);//创建一个variant数组
Byte1:=0;
Byte2:=0;
for I:=1 to Length(edit1.Text) div 2 do
begin
Ch1:=edit1.Text[2*I-1]; //I=1时,把输入的第一个字符赋给Ch1
Ch2:=edit1.Text[2*I]; //I=1时,把输入的第一个字符赋给Ch2,依次类推
if (ord(Ch1)>=ord('0')) and (ord(Ch1)<=ord('9')) then //如果Ch1是0到9的字符,取出Ch1,在ASCII中的位置,然后减去0的位置赋给Byte1
Byte1:=Ord(Ch1)-48
else if (ord(Ch1)>=ord('a')) and (ord(Ch1)<=ord('f')) then
Byte1:=Ord(Ch1)-87
else if (ord(Ch1)>=ord('A')) and (ord(Ch1)<=ord('F')) then
Byte1:=Ord(Ch1)-55;
if (ord(Ch2)>=ord('0')) and (ord(Ch2)<=ord('9')) then
Byte2:=Ord(Ch2)-48
else if (ord(Ch2)>=ord('a')) and (ord(Ch2)<=ord('f')) then
Byte2:=Ord(Ch2)-87
else if (ord(Ch2)>=ord('A')) and (ord(Ch2)<=ord('F')) then
Byte2:=Ord(Ch2)-55;
Sendvar[I]:=Byte1*16+Byte2;
end;
Form1.MSComm1.Output:=Sendvar; //MSComm1.Output是variant变量,书上说要想发送2进制数据,就要把字节型数据放入variant型变量中,所以我采用了这种变换方法,以为是初学,编的可能麻烦了大家原谅啊,国庆中秋双节快乐吧
end;