请高手赐招:232通讯中98和2000的缓冲问题 (100分)

  • 主题发起人 主题发起人 win2000server
  • 开始时间 开始时间
W

win2000server

Unregistered / Unconfirmed
GUEST, unregistred user!
程序用途是定时将查询得到的字串(一共有三个格式不同的字串)通过COM发送到终端设备上
代码如下:
function TSend_f.sendtod(ps: string): boolean;
begin
........
........
Comm1.StartComm;
sleep(200);
succflag := true;
for i := 0 to length(s) do
begin
if not comm1.writecommdata(@(s), 1) then
begin
succflag := false;
end;
sleep(20);
end;
if not succflag then
begin
//....
end;

comm1.StopComm;

........
end;

然后在button单击事件中调用sendtod来测试:
s1:='.............................';//查询得到的字串1
s2:='.............................';//查询得到的字串2
s3:='.............................';//查询得到的字串3
sendtod(s1);
sendtod(s2);
sendtod(s3);

以上测试过程在2000下测试终端显示都是正常的,但是发到98上运行却有问题:
就是对于第三个字串,终端只有收到一半左右字符,所以终端不能正常显示。
1:使用三个按钮分别执行sendtod(s1);sendtod(s2);sendtod(s3)这样就
没有问题,终端能正常显示,也就是说连续发送三个字串就会失败,但是分开
发送就没有问题。
2:后来考虑可能是不是COM关闭太早了,就在comm1.StopComm之前加了一个sleep(5000),
然后在一起连续发送三个字串,结果第三个字串还是不能全部被发送。
3:之后索性在程序打开时就打开Comm1.StartComm;程序关闭时comm1.StopComm;显示依旧。
4:调整
//
if not comm1.writecommdata(@(s), 1) then
begin
succflag := false;
end;
sleep(20);
//
中的sleep(20)为其他值,或者调整
//...
Comm1.StartComm;
sleep(200);
succflag := true;
//...
中的sleep(200)
不管是加大还是减小,问题还是没能解决。

请高手支招!!!
感激不尽!!!
 
你說在 win2k 下運行正常, 說明你的代碼是沒有問題的, 而是與系統變量設定有關!
建議將 sleep(20);
去掉試試!! 可能是緩衝區太小, 或是你發送的間隔太長!!
 
98和2000的默认缓冲区估计不是一样的,呵呵
Aiirii说的緩衝區太小有可能
你试试
s1:='..';//查询得到的字串1
s2:='..';//查询得到的字串2
s3:='..';//查询得到的字串3
sendtod(s1);
sendtod(s2);
sendtod(s3);

呵呵,猜测的,没做过串口通信
 
不清楚啊,我一般是sleep(1000)
 
在SendTod()后面加上点延时试试看.
 
to Aiirii: 我曾经试过把sleep(20)改成sleep(1),也是不行,不过完全去掉sleep我倒没有试过。
to 来如风:sleep(1000)对于我来说可能延迟太长了,因为三个字串加起来的长度大概是600左右。
to HeXiang Lee :我试过加sleep(2000)以及sleep(60000)好像也是不行的。
 
在线等各位更多的解答!!!
 
这个与字的多少无关,需要增加延时才能解决问题,要不然改用API可以节省时间。
 
谢谢各位!

最近找了很多这方面的资料,发现一条有用的信息,目前我还没有试过(我所调试的终端在客户那里比较远,所以没有时间马上赶过去调试),请大家看看是不是有一点道理(引自csdn的http://search.csdn.net/expert/topic/53/5301/2002/6/13/801037.htm):

使用sleep延时,程序将暂停一段时间,程序不能分配到cpu时间片,无法处理消息队列的其他消息,而每次调用ProcessMessages来延时,他可以处理一条正在等待处理的消息,在这里将会有机会释放掉串口的缓冲区,NumSec变量用来存你想要延时的时间(单位是秒),可以赋值为1(足够了)。
是串口的输出缓冲区被写满了。他没有时间释放,所以无法容纳其他更多的数据
在输出的循环中加入
StartTime := now;
repeat
Application.ProcessMessages;
until Now > StartTime + NumSec * (1/24/60/60);
变量声明:
NumSec: SmallInt;
StartTime: Tdatetime;
 
各位帮忙看看这是不是问题的关键?
 
是在sendtod(s2);sendtod(s3);前面加延时,可以用sleep,也可以是其他延时函数,大概sleep(500)就行了(win98延时要长点),我是这么解决的,主要是给时间让系统清空变量,还有就是最好是等到所有数据发送完了后再关闭端口。
 
我用spcomm,在win98中通过了,但在win2000中却没通过。是不是和发送缓存有关?
 
我的问题已经解决了,就是用
repeat
Application.ProcessMessages;
until Now > StartTime.......;
用sleep不行的原因可能是它将进程挂起了,无法向系统发送消息...
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2475740
 
将缓冲区定义大一些用SLEEP也可以。
 
后退
顶部