我这里设置了一个memo,一个edit,edit输入的可以认作是ASCII也可以认作是16进制,接收到的数据可以直接在memo里以ASCII显示,可以认为是16进制数,转换成相应的字符,再在memo里显示。但是,目前仅就ASCII发ASCII收,就碰到了很大的问题,[是直接把RXD和TXD连起来的。
收发如下:SPComm的各项设置如下:收发procedure如下:
串口接收到数据的处理进程procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
rbuf:array[1..256] of char;
rcvstring:string;
i,j:integer;
begin
SetLength(rcvstring,BufferLength);
move (buffer^,rbuf,Bufferlength);
if memochar.Checked then
for i:=1 to BufferLength do
begin
rcvstring[i]:=rbuf[i];
end;
if memo16.Checked then
begin
rcvstring:='';
for j:=1 to BufferLength do
begin
rcvstring:=rcvstring+inttohex(integer(rbuf[j]),2);
end;
end;
memo.Lines.Add('Receive: '+rcvstring);
end;
串口发数据的procedure
procedure TForm1.sendClick(Sender: TObject);
var
sbuf:array[1..128] of integer;
command,sendtext:string;
flag:boolean;
i,j:integer;
begin
if portopen then
begin
command:='';
command:=edit.Text;
if edit16.Checked then
begin
for i:=1 to Length(edit.Text) div 2 do
begin
try
sbuf[i]:= StrToInt('$'+command[2*i-1]+command[2*i]);
except
on Exception : EConvertError do
begin
ShowMessage(Exception.Message);
exit;
end;
end;
end;
command:='';
for j:=1 to Length(edit.Text) div 2 do
command:=command+Char(sbuf[j] mod 256);
end; sendtext:=command;
if autoreturn.Checked then
sendtext:=sendtext+#13#10; flag:=Comm1.WriteCommData(@sendtext,Length(sendtext));
if flag=false then
begin
showmessage('Êý¾Ý·¢ËÍʧ°Ü');
exit;
end;
memo.Lines.Add('Send: '+command);
end
else
showmessage('Çë´ò¿ª´®¿Ú');
end;
问题出在哪里,为什么会乱码。
收发如下:SPComm的各项设置如下:收发procedure如下:
串口接收到数据的处理进程procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
rbuf:array[1..256] of char;
rcvstring:string;
i,j:integer;
begin
SetLength(rcvstring,BufferLength);
move (buffer^,rbuf,Bufferlength);
if memochar.Checked then
for i:=1 to BufferLength do
begin
rcvstring[i]:=rbuf[i];
end;
if memo16.Checked then
begin
rcvstring:='';
for j:=1 to BufferLength do
begin
rcvstring:=rcvstring+inttohex(integer(rbuf[j]),2);
end;
end;
memo.Lines.Add('Receive: '+rcvstring);
end;
串口发数据的procedure
procedure TForm1.sendClick(Sender: TObject);
var
sbuf:array[1..128] of integer;
command,sendtext:string;
flag:boolean;
i,j:integer;
begin
if portopen then
begin
command:='';
command:=edit.Text;
if edit16.Checked then
begin
for i:=1 to Length(edit.Text) div 2 do
begin
try
sbuf[i]:= StrToInt('$'+command[2*i-1]+command[2*i]);
except
on Exception : EConvertError do
begin
ShowMessage(Exception.Message);
exit;
end;
end;
end;
command:='';
for j:=1 to Length(edit.Text) div 2 do
command:=command+Char(sbuf[j] mod 256);
end; sendtext:=command;
if autoreturn.Checked then
sendtext:=sendtext+#13#10; flag:=Comm1.WriteCommData(@sendtext,Length(sendtext));
if flag=false then
begin
showmessage('Êý¾Ý·¢ËÍʧ°Ü');
exit;
end;
memo.Lines.Add('Send: '+command);
end
else
showmessage('Çë´ò¿ª´®¿Ú');
end;
问题出在哪里,为什么会乱码。
解决方案 »
- 关于RegisterClasses注册窗体类,FindClass... ...
- 在局域网中同步观看音视频广播
- 怎么把一个大的pas文件分解成若干个小的pas文件?
- 怎样把Acess中的数据导入到一个Excel文件中?在线等!!!
- 请问如何转换两个stringgrid的焦点~~~~~~~~~~~在线等
- 我的程序有一个位置固定的自产生文件要安装程序执行就和程序复制到用户电脑固定地点如何办到
- 怎样使ADOQuery进行数据库操作出错时,不弹出报错窗口?
- sos:哪位手中有setup factory6的正式版软件,高分求购,请告知!
- 请问,delphil里如何单击按钮显示TabSheet
- 如何动态指定存储过程名后,参数也可自己跟上去?
- 给dbgrid赋值
- 散完走人
就是比如我发送helloworld,然后就会收到乱七八糟,我都不认识的中文字符
但是发相同内容,收到的乱码也是相同的
if flag=false then
begin
showmessage('Êý¾Ý·¢ËÍʧ°Ü');
exit;
end;
memo.Lines.Add('Send: '+command);
end
else
showmessage('Çë´ò¿ª´®¿Ú');
end;
你都乱码了
建议还是使用一些串口工具 测试下
flag:=comm1.WriteCommData(@sendtext,Length(sendtext));
换成
for i:=1 to Length(sendtext) do
if not comm1.WriteCommData(@sendtext[i],1) then
begin
flag:=false;
break;
end;就好了,原理,尚未知……