请来看看里面的问题!顺便来拿分吧!up有分!!! (100分)

  • 主题发起人 danliyou
  • 开始时间
D

danliyou

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在利用spcomm控件进行串口通讯,由于要传送的字节比较大,
所以我就对数据包进行分割,每次传送521字节(包括包头和结束字符)。
发送程序如下:
procedure TFCOMM.Button2Click(Sender: TObject);

var
i,j:integer;
begin
count:=0;
memo1.Clear;
for j:=1 to 30 do
begin
sbuf[521*(j-1)+1]:=byte($aa);
sbuf[521*(j-1)+2]:=byte($01);
sbuf[521*(j-1)+3]:=byte($80);
sbuf[521*(j-1)+4]:=byte($00);
sbuf[521*(j-1)+5]:=byte($20);
sbuf[521*(j-1)+6]:=byte($00);
sbuf[521*(j-1)+7]:=byte($00);
sbuf[521*(j-1)+8]:=byte($00);
for i:=0 to ((512 div 16)-1) do
begin
sbuf[521*(j-1)+9+16*i]:=byte($49);
sbuf[521*(j-1)+9+16*i+1]:=byte($07);
sbuf[521*(j-1)+9+16*i+2]:=byte($37);
sbuf[521*(j-1)+9+16*i+3]:=byte($a9);
sbuf[521*(j-1)+9+16*i+4]:=byte($e6);
sbuf[521*(j-1)+9+16*i+5]:=byte($af);
sbuf[521*(j-1)+9+16*i+6]:=byte($06);
sbuf[521*(j-1)+9+16*i+7]:=byte($fc);
sbuf[521*(j-1)+9+16*i+8]:=byte($01);
sbuf[521*(j-1)+9+16*i+9]:=byte($68);
sbuf[521*(j-1)+9+16*i+10]:=byte($30);
sbuf[521*(j-1)+9+16*i+11]:=byte($4e);
sbuf[521*(j-1)+9+16*i+12]:=byte($ac);
sbuf[521*(j-1)+9+16*i+13]:=byte($b3);
sbuf[521*(j-1)+9+16*i+14]:=byte($31);
sbuf[521*(j-1)+9+16*i+15]:=byte($d2);
end;
sbuf[521*j]:=byte($55);
senddata1;{调用发送函数}
end;
end;

procedure senddata1;
//自定义的发送数据过程
var
i,j:integer;
commflg:boolean;
begin
viewstring:='';
commflg:=true;
for i:=(count*521+1) to ((length(sbuf) div 30)+count*521) do
begin
if not fcomm.comm2.writecommdata(@sbuf,1) then
begin
commflg:=false;
messagedlg('发送失败!!!!!',mterror,[mbyes],0);
break;
end;
sleep(2);
//发送时字节间的延时
viewstring:=viewstring+inttohex(sbuf,2)+'';
end;
viewstring:='';
for i:=(9+521*count) to (520+521*count) do
begin
viewstring:=viewstring+inttohex(sbuf,2)+'';
end;
fcomm.memo1.lines.add(viewstring);
count:=count+1;

messagedlg('发送成功!',mtinformation,[mbyes],0);//!!!注意这一行,加上这一行,传送正确。
//但是去掉这一行,就会出现“发送失败!”,实在是不明白!!!
if not commflg then
begin
messagedlg('发送失败!',mterror,[mbyes],0)
end;
end;

sbuf:array[1..15630] of byte;
messagedlg('发送成功!',mtinformation,[mbyes],0);//!!!注意这一行,加上这一行,传送正确。
//但是去掉这一行,就会出现“发送失败!”,实在是不明白!!!
请哪位大侠给看看呀,谢谢!!

 
up 一下!
 
再up!!!
来人啦。
谢谢!
 
最后一次up!
真诚的希望有人回复我的问题!
一万分的感谢!!!一辈子的感激!!!
 
1.你在这么长的循环中用Sleep很容易出现问题,导致程序对消息的处理滞后,因起许多问题
建议在VCL线程里不要有大量时间的Sleep,改用这样的过程:
procedure SleepVCL(Interval:DWORD);
var tc:DWORD;
begin
tc:=GetTickCount;
while GetTickCount-tc<Interval do
Application.ProcessMessages;
end;
这样使主线程能及时处理消息
2。问题早造成的原因应该是消息积压没有得到及时处理。 你用MessagDlg时,程序在背后实际将刚才循环的产生的消息处理掉了,
因为你点掉MessageDlg毕竟需要0.1秒级的时间,这点时间对程序成立来说足够了。
而没有这句话,在你的循环中,主线程根本没有机会处理发送数据等引起的消息(SPcomm在发送、接收等时候都要发消息的),
消息得不到及时处理,消息队列满后,发送数据时的产生的消息自然不能正确发送,所以出错了。
把Sleep(2)换成 我给你的 SleepVCL(2)应该可以,虽然我没做实验,但这问题以前我遇到过许多
 
to Avenir:谢谢你呀!
照你说的做了,果然没有问题啦。
发分啦!
 
多人接受答案了。
 
顶部