笨
笨波
Unregistered / Unconfirmed
GUEST, unregistred user!
我自编的串口通讯程序,但有点问题,如可相帮,除了送分外,还送一套串口通讯监测程序,很好用。到目前为止,12啦,还有人帮我呢,高手呀,快出手吧,拉兄弟一把吧。 (100分)<br />下面是我在大家的帮助下,和自自的努力下写的串口通讯程序,可以说简单实用,但用的时候发现
二个问题,希望各位多多指教。
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Caption:=' 阿波' ;
MSComm1.InBufferCount:=0;
MSComm1.InputLen:=0;
MSComm1.RThreshold:=1;
MSComm1.Settings:='1200,n,8,1';
//,n,"(无校验)或",o,"(奇校验)或",e,"(偶校验)
//,m,"(校验位恒定为1)!
//,s,"(校验位恒定为0)!
MSComm1.CommPort:=1;
MSComm1.DTREnable:=true;
MSComm1.RTSEnable:=true;
MSComm1.PortOpen:=true;
Memo2.text:='';
Memo1.text:='';
ComboBox1.text:='1200,e,8,1';
ComboBox1.Items.Insert(0,'1200,e,8,1');
ComboBox1.Items.Insert(1,'2400,e,8,1');
ComboBox1.Items.Insert(2,'4800,e,8,1');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
s,datastr:string;
begin
s:=memo1.text;
for i:=0 to (length(s) div 2)-1do
begin
datastr:=datastr+chr(strtoint('$'+ copy(s,2*i+1,2)));
end;
begin
MSComm1.Settings:=ComboBox1.text;
MSComm1.output:=datastr;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if MSComm1.PortOpen=true then
MSComm1.PortOpen:=false;
close();
end;
procedure TForm1.MSComm1Comm(Sender: TObject);
var
recstr:Olevariant;
begin
MSComm1.Settings:=ComboBox1.text;
if Mscomm1.CommEvent=comEvReceive then
begin
sleep(350);
recstr:=MSComm1.input;
Memo2.text:=memo2.text+recstr;
//如何将接收到的字符还原为16进制数据的,用了(CAPTION=ITNTOHEX(ORD(‘A’),2)好象不行吗。
end;
end;
procedure TForm1.Formdestroy(Sender: TObject);
begin
if MSComm1.PortOpen=true then
MSComm1.PortOpen:=false;
end;
end.
通过监测器我发现第一个问题是:当MEMO1中有如下数据时会出错,F32C(十六进制),或2D3C(十六进制)等等,即第I个字符要和第2*I+1个相同,
要么都是字母,要么都是数字。当然MEMO1中必须是十六进制数。
第二个就是我通过监测器看到有数据返回了,可我的MEMO2中却没有接到,怎么回事,我写的不对吗,好象不是吧。
二个问题,希望各位多多指教。
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Caption:=' 阿波' ;
MSComm1.InBufferCount:=0;
MSComm1.InputLen:=0;
MSComm1.RThreshold:=1;
MSComm1.Settings:='1200,n,8,1';
//,n,"(无校验)或",o,"(奇校验)或",e,"(偶校验)
//,m,"(校验位恒定为1)!
//,s,"(校验位恒定为0)!
MSComm1.CommPort:=1;
MSComm1.DTREnable:=true;
MSComm1.RTSEnable:=true;
MSComm1.PortOpen:=true;
Memo2.text:='';
Memo1.text:='';
ComboBox1.text:='1200,e,8,1';
ComboBox1.Items.Insert(0,'1200,e,8,1');
ComboBox1.Items.Insert(1,'2400,e,8,1');
ComboBox1.Items.Insert(2,'4800,e,8,1');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
s,datastr:string;
begin
s:=memo1.text;
for i:=0 to (length(s) div 2)-1do
begin
datastr:=datastr+chr(strtoint('$'+ copy(s,2*i+1,2)));
end;
begin
MSComm1.Settings:=ComboBox1.text;
MSComm1.output:=datastr;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if MSComm1.PortOpen=true then
MSComm1.PortOpen:=false;
close();
end;
procedure TForm1.MSComm1Comm(Sender: TObject);
var
recstr:Olevariant;
begin
MSComm1.Settings:=ComboBox1.text;
if Mscomm1.CommEvent=comEvReceive then
begin
sleep(350);
recstr:=MSComm1.input;
Memo2.text:=memo2.text+recstr;
//如何将接收到的字符还原为16进制数据的,用了(CAPTION=ITNTOHEX(ORD(‘A’),2)好象不行吗。
end;
end;
procedure TForm1.Formdestroy(Sender: TObject);
begin
if MSComm1.PortOpen=true then
MSComm1.PortOpen:=false;
end;
end.
通过监测器我发现第一个问题是:当MEMO1中有如下数据时会出错,F32C(十六进制),或2D3C(十六进制)等等,即第I个字符要和第2*I+1个相同,
要么都是字母,要么都是数字。当然MEMO1中必须是十六进制数。
第二个就是我通过监测器看到有数据返回了,可我的MEMO2中却没有接到,怎么回事,我写的不对吗,好象不是吧。