SPCOMM问题 请高手帮忙!!!在线等!!!(1分)

  • 主题发起人 主题发起人 king_213
  • 开始时间 开始时间
K

king_213

Unregistered / Unconfirmed
GUEST, unregistred user!
我用SPCOMM接收的汉字全是乱码(数字不乱) 不知为何???就这点分了 对不起!!!
procedure TfrmComm.CommReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
strRecv : string;
begin
setLength(strRecv,BufferLength);
Move(Buffer^,pchar(strRecv)^,BufferLength);
memo1.Lines.Add(strRecv);
end;
请问如何能正确显示汉字???
 
串口发送的格式是十进制还是十六进制
 
要是数字不乱的话,应该是你的发送端有问题,汉字是双字节的,顺序不能颠倒,你可以尝试把它颠倒过来看看。
 
先看一下SPCOMM的参数设置对不对,数据位8,停止位1
再看看MEMO的字体设置是否正确
再看看数据串中是否汉字和英文混杂着,至少要确保汉字前的英文字符为偶数个,否则可能无法正确显示汉字
 
你用一个串口线。自己给自己发。字符。看看能不能收到
 
帮顶!

╭=========================================╮

80G海量源代码,控件,书籍全免费狂下不停!

http://www.source520.com

╰=========================================╯
 
以上大家说的我都试过了 可还是无法正确显示 数字和字母显示都没问题 就是不能正常显示汉字 急死了!!! 求高手帮忙!!!!
 
procedure TMainForm.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
tmpArray: array[0..4096] of Byte;
ArraySize: DWord;
Count: DWord;
tmpStr, Str: String;
pStr: PChar;
I, K: Integer;
begin
begin
pStr := Buffer;
tmpStr := string(pStr);
Dec(PStr);
Str := '';
for I := 0 to Length(tmpStr)-1 do
begin
Inc(PStr);
tmpArray:=Byte(PSTR^);
Str := Str + IntToHEX(Ord(tmpArray),2) + ' ';
end;
Memo1.Lines.Add('接收: ' + Str);
end;
end;
 
上述接收后得到的是十六进制的内容呀!!!
能不能显示汉字??
 
接收到的都是汉字的机内码,需要把它转为汉字。两个字节和为一个汉字
 
请问两个字节怎样合为一个汉字呀??
 
//读取点阵
if Length(strChinese) > 0 then
begin //Hzk16为16×16点阵
AssignFile(f, 文件所在路径');
reset(f, 1);
n := Length(strChinese) div 2;
for i := 0 to n - 1 do
begin
strChar := Copy(strChinese, i*2+1, 2); //转化成字符
MakeChar(strChar, i);
for l:=0 to 31 do
begin
Memo1.Lines.Add(inttohex(getstr[l],2));
end;
end;
CloseFile(f);
end;
 
帮顶!

╭=========================================╮

80G海量源代码,控件,书籍全免费狂下不停!

http://www.source520.com

╰=========================================╯
 
to king_213,我的程序和你的一样连数字都不能显示啊,看一下我的程序
为什么好像没有收到数据一样,我把.exe运行在两台机子和一台机子都一样的.不能收到发过去的攸信息 是什么问题.我机子的串口是没有问题的.
.//向端口发送数据
procedure TfrmComm.btnSendClick(Sender: TObject);
var
str: Pchar;
Count: integer;
begin
if edtSendText.Text='' then
raise exception.create('发送字符串为空,错误终止');
COUNT:=edtSendText.GetTextLen;//获取文本框里字符长度
str := Pchar(edtSendText.Text);
//Count := Length(str);
if Comm.WriteCommData(str,Count) then//str参数为要发送的字符串,count参数设置发送字符串的长度。函数用于将一个字符串发送到写进程,发送成功返回TRUE反之返回FLASE
begin
mmoComm.lines.Add('已发送字符串为:'+str );//'总共有'+ intTostr(Count) + '个字符')
mmoComm.lines.Add ('串长度'+ intTostr(Count) + '个字符');
end
else
raise exception.Create('发送错误');
end;


//从端口接收数据
procedure TfrmComm.CommReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word);
var
str1,strRecv : string;
begin
setLength(strRecv,BufferLength);
Move(Buffer^,pchar(strRecv)^,BufferLength);
mmoComm.Lines.Add('已收到: '+intTostr(BufferLength)+'字节的数据');
mmoComm.Lines.Add(strRecv);
mmoComm.Invalidate ;
//******************
//出于无奈只有使用以下方法来证实一下真的收到过数据没有.但还是无奈,没有
if StrRecv='abcdefg' then
showmessage(' 收取成功!');
str1:=Copy(StrReCv,1,2);
if Str1='ab' then
showmessage('判断成功!');

end;
 
后退
顶部