| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1810 人关注过本帖
标题:[求助]谁有16进制转换的程序呀,给我借鉴一下吧
只看楼主 加入收藏
wjz
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2006-9-26
收藏
 问题点数:0 回复次数:7 
[求助]谁有16进制转换的程序呀,给我借鉴一下吧
我在做串口通讯,是个初学者,欢迎大家一起研究讨论
现在需要把字符类型转换成16进制发送出去,不会啦,我用的是mscomm控件,谁能帮帮我啊,谢谢啦
搜索更多相关主题的帖子: 进制 借鉴 串口 
2006-09-26 16:48
fxzmodel
Rank: 2
等 级:新手上路
威 望:4
帖 子:50
专家分:0
注 册:2006-2-20
收藏
得分:0 

以下是字符/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编辑过]

2006-09-26 23:28
wjz
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2006-9-26
收藏
得分:0 
回复:(fxzmodel)以下是字符/16进制和16进制/字符的...
非常感谢呀,我试试吧
2006-09-27 16:28
wjz
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2006-9-26
收藏
得分:0 
怎么不对劲儿呢

我把你那个字符转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-09-29 14:29
fxzmodel
Rank: 2
等 级:新手上路
威 望:4
帖 子:50
专家分:0
注 册:2006-2-20
收藏
得分:0 
还是没明白你的意思,1的ASCII=49,而16进制形式则确实=31呀.没错呀.顺便说一下,我的哪个程序是纯粹用来转换字符的16进制形式的,另外关于你的哪个程序,拜托麻烦你把注释写一下,我最讨厌看别人没写注释的程序了,首先要花很多精力去理解别人的编程思想,然后才能去找别人的逻辑错误或者是语法错误.另外你这个程序的主要功能是干什么用的?你只是说用来做串口通讯的,如果仅仅PC之间是用来传送数据的,还用其他更好的方法,没必要搞的这么痛苦的去转换数据-传送-然后在还原.用ClientSocket组件可以很容易的实现PC间通信,而且可以利用互联网传送信息.

[此贴子已经被作者于2006-9-29 23:53:35编辑过]


2006-09-29 23:42
fxzmodel
Rank: 2
等 级:新手上路
威 望:4
帖 子:50
专家分:0
注 册:2006-2-20
收藏
得分:0 

byte类型属于整数类型,而你要发送的16进制数字在delphi中是以string类型存储的.所以不行.另外直接一10进制发送不是更简单一些吗?为什么要转换成16进制发送.

2006-09-30 09:59
wjz
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2006-9-26
收藏
得分:0 

我这个程序是把字符变量转为字节变量发送出去(给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;

2006-09-30 10:35
wjz
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2006-9-26
收藏
得分:0 
是呀,我也是才想明白,困扰我好几天了,天资太差了,郁闷!谢谢啦
2006-09-30 10:39
快速回复:[求助]谁有16进制转换的程序呀,给我借鉴一下吧
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.045934 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved