串口通讯(spcomm)一问(100分)

  • 主题发起人 主题发起人 xiaoke
  • 开始时间 开始时间
X

xiaoke

Unregistered / Unconfirmed
GUEST, unregistred user!
我要做一个与弹片机通讯的程序,在主窗体里放了一个spcomm,另一个窗体里
也放了一个spcomm,用来发送很简单的字符,结果主程序里的那个出现了t2261的
错误代码,而在没有给主窗体放spcomm之前,没有什么问题,是不是一个应用程序里
不能放两个spcomm?还有,我要实现这样的功能,就是先发送一个字符串给对方,
告知对方我要实现那个功能,对方再发一个字符串给我,表示准备好,我在收到
这个字符串时,在把我的数据传送过去,传送完毕后,对方再返回一些结果信息,该如何
实现啊?在一个buttonclick下,那些中间的延时怎么把握?还有每次再发送前是不是该
先清空buffer?
 
是不是他们指向一个串口?
最好清空
 
是的,但是程序刚启动的时候,点主界面的发送久不成功,
而进入子界面的发送却都能成功,我想不应该是没有清控的
缘故吧,如果要清控,该在什么地方、怎样清空?
这个控件的用法有没有帮助的文档啊?
 
同一个串行口不能同时被两个SPCOMM之类的串行口控件打开的,因为串行口是互斥的资源!
理论上不需要清空的(你要发什么数据你自己当然知道,而通常你关闭串行口的时候总是
再当前报文已经发送完才做的)
 
但是后来我去掉了一个,采用调用子界面的那个控件,
还是不行啊?我把程序贴出来,你帮我看看好吗?
procedure senddata;
var
i:integer;
commflg:boolean;
begin

commflg:=true;
for i:=1 to 6 do
begin
if not suozitlw.comm1.writecommdata(@sendbuf,1) then
begin
//suozitlw.comm1.stopcomm;
commflg:=false;
break;
end;
//发送时字节间的延时
sleep(2);

end;

if not commflg then messagedlg('发送失败 !' ,mterror,[mbyes],0);
end;

procedure TForm1.LMDButton15Click(Sender: TObject);
begin
sendbuf[1]:=byte($ff); //帧头
sendbuf[2]:=byte($01); //命令号
sendbuf[3]:=byte($ff);
sendbuf[4]:=byte($ff);
sendbuf[5]:=byte($01);
sendbuf[6]:=byte($f0); //帧尾
senddata;//调用发送函数
end;//以上为主程序里发送握手信号,发送失败


procedure senddata(lth:longint);
var
i:integer;
commflg:boolean;
begin
viewstring:='';
commflg:=true;
for i:=1 to lth do
begin
if not suozitlw.comm1.writecommdata(@sbuf,1) then
begin
commflg:=false;
break;
end;
//发送时字节间的延时
sleep(2);
viewstring:=viewstring+inttohex(sbuf,2)+'';
end;
viewstring:='发送'+ viewstring;
suozitlw.memo1.lines.add(viewstring);
suozitlw.memo1.lines.add('');
if not commflg then messagedlg('发送失败 !' ,mterror,[mbyes],0);
end;


procedure Tsuozitlw.LMDButton1Click(Sender: TObject);
var
reg:tregistry;
i:integer;
a0,a1,a2,a3,a4,a5,a6,a7: string;
begin
for i:=0 to 7 do
begin
if (stringgrid1.cells[1,i]='') then
stringgrid1.cells[1,i]:=stringgrid1.cells[0,i]
end;

Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKey('/Software/henji/cc', True) then
begin
Reg.WriteString('a0',stringgrid1.cells[1,0]);
Reg.WriteString('a1',stringgrid1.cells[1,1]);
Reg.WriteString('a2',stringgrid1.cells[1,2]);
Reg.WriteString('a3',stringgrid1.cells[1,3]);
Reg.WriteString('a4',stringgrid1.cells[1,4]);
Reg.WriteString('a5',stringgrid1.cells[1,5]);
Reg.WriteString('a6',stringgrid1.cells[1,6]);
Reg.WriteString('a7',stringgrid1.cells[1,7]);
end;

finally
Reg.CloseKey;
Reg.Free;
inherited;
end;
sbuf[1]:=byte($aa); //帧头
sbuf[2]:=byte($bb);
senddata(2);//发送成功
form1.show;
close;
end;
请高手帮忙看一下,到底是什么原因啊?对串口方面的基础知识也不太动,
这个控件也不太会用,帮忙指点一下吧,谢谢
 
握手信号发送失败,但是后面的信号却能发送成功,该是什么原因呢?
多多指点,谢谢!我刚来这儿,分数不是很多,但是我会尽量多给的!
 
不用看下去,你的串行口程序错得离谱(很抱歉这样说),首先,发送是已整个数据块进行
发送的,不需要你一个个字节去发,你只需要接管“发送缓冲区空”事件来管理发送完的处
理就可以的。
 
哈哈,这可是网上现成的程序哦!错在什么地方啊?能不能给我
指点一下?对了,谁能给我一个与单片机通讯的完整例子啊,
我把我的积分全给你,怎样?高手帮帮忙吧,俺现在比较急阿,不能
自己慢慢研究。kefujun@zju.edu.cn
 
你看的是《delphi串口编程》一书吧,那本书将的还是很细的,好好看看,有帮助。有关串口编程的东西还是很简单的,不要急,如果你实在撑不下去了,和我联系,我今天下午刚刚编了一个和单片机通讯的程序。我的e-mail:cjh_xf@sina.com我希望你是自己认真思考还不能解决的情况下和我联系。
 
这本书有网上哪儿可以下载吗?
我在杭州的各大书店找了一下,没有
找到有关delphi编程的书啊,能不能提供一些
关于这本书的出售信息啊?多谢多谢
 
写个邮件过来,把你的要求描述清楚!我给你个程序好了
 
to SupermanTm:
告诉我邮箱吧,谢谢
 
treemanwww@163.com
treemanwww@sina.com
 
多谢了各位
 
后退
顶部