关于串口通信,用定时器循环发送MEMO,多出1秒,查不出什么问题~
delphi吧
全部回复
仅看楼主
level 1
cooblai 楼主
我是使用串口发送,如果AUTO下面的CHECKBOX被选择,那么通过左边按钮发送一条数据,只要定时发送没有被取消,就周而复始的发送被AUTO选择的数据。我现在定时器是是1秒发送一次,比如我在每个MEMO里都填了数据,AUTO全部选择,按上面代码进行发送,在1到11时,都是间隔1秒发送,但是从11到1这个新循环时,好像多出了1秒,比如用了11秒把1到11都发送了,按照我的想法,第12秒,应该又要发1了,但是实际是第13秒才发1。
2014年03月25日 09点03分 1
level 11
你自己算下你这第12秒都干了些啥嘛。
进这个过程,然后For循环条件不满足,直接到判断n>11了,然后置1,其实啥都没做。
而你的第11秒,结束后根本就没有给n置1,在第一个Exit之前,虽然n已经变成12,但是后面跟着一个Exit直接退出了。
你可以这么改一下:
...
inc(n)
if n<=11 then
exit;
...
2014年03月25日 09点03分 2
[真棒]
2014年03月25日 09点03分
我想在问下,现在当q11被选择的时候,是不会多出1秒,若q11没有选择的时候,也就是第11个数据不用发送时,又多出了1秒,这里我怎么也想不明白哪里出问题了。[狂汗]
2014年03月25日 15点03分
level 1
cooblai 楼主
我把AUTO下面的命名成q1,q2...q11, 右边的button命名成b1,b2....b11。中间的为MEMO1,MEMO2...MEMO11等
2014年03月25日 09点03分 3
level 11
原来你是要做成这样啊,那你这个设计本来就有错误。你必须要判断循环轮空的状况。
你代码里问题很多,首先,
你没有发现你的那个inc(n)在判断条件前后都出现了么?也就是说,不管if语句怎么执行,inc(n)都会被执行。所以这两个inc(n)可以合并。
另外,你在执行的时候,要对轮空状态进行特殊处理,你现在的程序无能为力。
最后,你还得判断一下,所有Auto都没选的情况,也算一种轮空,很容易处理成死循环。
我这里给你写了一段代码,你可以参考下,因为你代码不规范,我又懒得大改,所以
用了行标,这个设计你也可以重新写下,我想应该有更好的办法:
2014年03月25日 16点03分 4
level 10
FOR 语句都不会用,还搞个屁开发啊。
有你这样用的吗?
你这个需求,根本不需要 FOR !
IF (N< 1) OR (N >11) THEN
BEGIN
N := 1;
END;
//然后直接到
if TCheckBox ...... then
begin
Tbutton .. ...;
end;
//最后
INC(N);
//这样你的代码就 OK 了。
2014年03月26日 02点03分 5
你这个代码是用在全部循环,假如我点就勾选了Q1和Q11,那就他们之间要隔10秒才会发送。
2014年04月02日 02点04分
level 10
记住:去掉你的 EXIT。
2014年03月26日 02点03分 6
level 9
代码好乱,和我的习惯差别很大
2014年03月30日 04点03分 9
1