哪位先进可以解析一下此串口控件的用法? |
尚未結案
|
sailorjoye
一般會員 發表:11 回覆:18 積分:5 註冊:2003-05-13 發送簡訊給我 |
uses SPComm;
//变量说明
var
FCOMM: TFCOMM;
Viewstring:string;
i:integer;
rbuf,sbuf:array[1..6] of byte;
//打开串口
procedure TFCOMM.FormShow(Sender: TObject);
begin
comm1.StartComm;
end;
//关闭串口
procedure TFCOMM.FormClose(Sender: TObject; var Action: TCloseAction);
begin
comm1.StopComm;
end;
//发送数据{自定义的发送过程}
procedure senddata;
var
i:integer;
commflg:boolean;
begin
viewstring:='';
commflg:=true;
for i:=1 to 6 do
begin
if not fcomm.comm1.writecommdata(@sbuf[i],1) then
begin
commflg:=false;
break;
end;
sleep(2); {发送时字节间的延时}
viewstring:=viewstring inttohex(sbuf[i],2) '';
end;
viewstring:='发送:' viewstring;
fcomm.memo1.lines.add(viewstring);
fcomm.memo1.lines.add('');
if not commflg then messagedlg('发送失败!',mterror,[mbyes],0);
end;
procedure TFCOMM.Btn_sendClick(Sender: TObject);{发送按钮的点击事件}
begin
sbuf[1]:=byte($f0); {帧头}
sbuf[2]:=byte($01); {命令号}
sbuf[3]:=byte($ff);
sbuf[4]:=byte($ff);
sbuf[5]:=byte($01);
sbuf[6]:=byte($0f); {帧尾}
senddata;{调用发送函数}
end;
接收过程
procedure TFCOMM.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i:integer;
begin
viewstring:='';
move(buffer^,pchar(@rbuf)^,bufferlength);
for i:=1 to bufferlength do
viewstring:=viewstring inttohex(rbuf[i],2) '';
viewstring:='接受' viewstring;
memo1.lines.add(viewstring);
memo1.lines.add('');
end; 指导我的人说这个历程可以自动接收数据,可是我调试不出,特来求教!
我暂定的协议是这样的:先向串口发送36个'00H',波特率、校验位及数据
位和停止位默认,等待30ms后,再向串口发送55H,准备接收数据,若无数
据则退出,有则将数据存入*.ini文件中!还望各位前辈不吝赐教!^&^! 凤翅天翔, 无比彷徨!
------
凤翅天翔, 无比彷徨! |
sailorjoye
一般會員 發表:11 回覆:18 積分:5 註冊:2003-05-13 發送簡訊給我 |
|
sailorjoye
一般會員 發表:11 回覆:18 積分:5 註冊:2003-05-13 發送簡訊給我 |
|
wnhoo
高階會員 發表:75 回覆:443 積分:198 註冊:2003-04-22 發送簡訊給我 |
这是我以前做的串口调试工具,使用的是SPCOMM,但我现在用MSCOMM32做。
好象SPCOMM存在一些缺点。
下面是我使用SPCOMM的发送与接受的代码:
procedure TForm1.Timer1Timer(Sender: TObject);
var
i:integer;
sbuf:Pchar;
str:string;
begin
str:=Chr($01)+'00'+Chr($43)+trim(datago.text)+Chr($0d);
GetMem(sbuf,Length(str)+1);
StrPLCopy(sbuf,str,Length(str));
Comm1.WriteCommData(sbuf,strlen(sbuf));
str:='';
for i:=0 to strlen(sbuf)-1 do
str:=str+IntToHex(Ord(sbuf[i]),2)+' ';
str:='发送>'+str;
look.Lines.Add(str);
stat.Lines.Add('发送OK!');
FreeMem(sbuf);
end; procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
VAR
i:integer;
begin viewstring:='';
move(buffer^,rbuf,bufferlength);
for i:=1 to bufferlength do
viewstring:=viewstring+ inttohex(rbuf[i],2)+' ';
viewstring:='接收<'+ viewstring;
look.lines.add(viewstring);
if rbuf[5]<>65 then
begin
//Timer1.Enabled :=false;
stat.Lines.Add('数据接收OK!');
end;
end; 这是可以用的!!! 我看了你的代码,好象没有发现什么错误。我揣测,可能是你发送的命令不对,因为不同的串口设备有不同的协议,只有协议符合时,串口设备才反馈信息。 你可能是发送了命令,但不被串口设备识别。所以就没有返回信息了!!! 供参考! 风花雪月 e梦情缘
------
风花雪月 e梦情缘 |
sailorjoye
一般會員 發表:11 回覆:18 積分:5 註冊:2003-05-13 發送簡訊給我 |
|
sailorjoye
一般會員 發表:11 回覆:18 積分:5 註冊:2003-05-13 發送簡訊給我 |
|
sailorjoye
一般會員 發表:11 回覆:18 積分:5 註冊:2003-05-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |