关于mscomm发送接收hex编码,谢谢 ( 积分: 100 )

  • 主题发起人 主题发起人 leoduba
  • 开始时间 开始时间
L

leoduba

Unregistered / Unconfirmed
GUEST, unregistred user!
你好,我现在使用mscomm进行通讯,需要发送和接收hex字符,请问怎么把字符串转换为hex,怎么把接收的hex转换为string呢,谢谢帮忙
 
数据本质上都是二进制的,hex和字符串的区别是对数据进行不同的解析。
比如说:$30,解析成字符是'0',数字是48,hex就是$30。
 
主要是看你如何解析缓冲区内的数据,如果你用PChar作缓冲区,那么该变量就是string;如果你用字符数组作缓冲区,那么该变量就是Hex。
 
多谢,我要发送的 hex 数据 是 10 00 10,我用string 型,
直接
MSComm1.Output:='10 00 10',结果好像不对,我不知道怎么转化才能得到hex数据

我发现那些调试工具都有 ascii 和 hex两种发送模式,我想知道怎样转换,多谢
 
有人能帮一下忙吗?谢谢啊
 
MSCOMM控件用的是WideString
会有个转换过程
你需要使用字节数据组进行传递数据
 
'10 00 10' -->> 转换成
SendData: array[0..2] of Byte;
SendData[0] := $10;
SendData[1] := $00;
SendData[2] := $10;

自己可以做个转换函数。
 
楼主:这个跟你的通讯协议有关啊
内容当着字符还是数据来处理要弄清楚,这个跟发送方和接收方如何处理内容都有关
比如:
如果接收方规定只处理数据,而且是十六进制数据,那么发送方就要对发送内容进行处理
首先要理清,接收时是一个字节一个字节的处理的
如果要接收的十六进制为100010
发送方:发送的内容就为MSComm.OutPut:= char($10) + char($00) + char($10);
 
procedure TForm1.FormCreate(Sender: TObject);
begin
if MSComm1.PortOpen then
mscomm1.PortOpen := false;

MSComm1.CommPort := 1;
MSComm1.Settings := '9600,n,8,1'; //波特率 奇偶校验 数据位 停止位

MSComm1.InBufferSize := 256;
MSComm1.OutBufferSize := 256;

MSComm1.InputMode := cominputModetext; //文本方式
MSComm1.InputMode := comInputModeBinary;//二进制方式

MSComm1.InputLen := 0; //接收缓冲区中的全部内容

MSComm1.InBufferCount := 0; //清除
MSComm1.OutBufferCount := 0;

MSComm1.RThreshold := 32;//设置接收32个字节就触发事件OnComm事件
MSComm1.PortOpen := true;
end;

procedure TForm1.MSComm1Comm(Sender: TObject);
var
buffer: olevariant;
str: string;
i: integer;
begin
case MSComm1.CommEvent of
comEvReceive: begin
if MSComm1.InputMode = comInputModeText then
str := MSComm1.Input
else if MSComm1.InputMode = comInputModeBinary then
buffer := MSComm1.Input;
for i := 0 to MSComm1.RThreshold - 1 do
begin
if MSComm1.InputMode = comInputModeText then
Memo2.Text := Memo2.Text + IntToHex(byte(str[i + 1]), 2) + ' '
else if MSComm1.InputMode = comInputModeBinary then
Memo2.Text := Memo2.Text + intToHex(Buffer, 2) + ' ';
end;
end;
end;

end;

procedure TForm1.Button1Click(Sender: TObject);
var
Send: string;
i: integer;
begin
Send := memo1.Text;
MSComm1.Output := send;
MSComm1.RThreshold := length(send);
end;
 
[blue]来自:leoduba, 时间:2007-3-1 17:57:21, ID:3674973
多谢,我要发送的 hex 数据 是 10 00 10,我用string 型,
直接
MSComm1.Output:='10 00 10',结果好像不对,我不知道怎么转化才能得到hex数据
我发现那些调试工具都有 ascii 和 hex两种发送模式,我想知道怎样转换,多谢[/blue]

你这样弄是不行的。
你用要string型发送 10 00 10需要这样
MSComm1.Output:=#$10#$00#$10;
才行。
 
谢谢大家的帮助,我找到解决办法,我发放出来吧,感谢代码作者,第一个是发送前string转HEX,第二个是收到hex转string!每人25分,大家没意见吧....................

function HexStrToStr(const S: string): string;
//16进制字符串转换成字符串
var
t: Integer;
ts: string;
M, Code: Integer;
begin
t := 1;
Result := '';
while t <= Length(S) do
begin //xlh 2006.10.21
while (t <= Length(S)) and (not (S[t] in ['0'..'9', 'A'..'F',

'a'..'f'])) do
Inc(t);
if (t + 1 > Length(S)) or (not (S[t + 1] in ['0'..'9', 'A'..'F',

'a'..'f'])) then
ts := '$' + S[t]
else
ts := '$' + S[t] + S[t + 1];
Val(ts, M, Code);
if Code = 0 then
Result := Result + Chr(M);
Inc(t, 2);
end;
end;


function StrToHexStr(const S: string): string;
//字符串转换成16进制字符串
var
I: Integer;
begin
for I := 1 to Length(S) do
begin
if I = 1 then
Result := IntToHex(Ord(S[1]), 2)
else
Result := Result + ' ' + IntToHex(Ord(S), 2);
end;
//ShowMessage(inttostr(I));
end;
 

Similar threads

回复
0
查看
1K
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部