那位老兄帮我想想如何连续发送命令的呀,应该很简单的呀,可一个星期过去了,也没人帮我。(40分)

  • 主题发起人 主题发起人 逆水
  • 开始时间 开始时间

逆水

Unregistered / Unconfirmed
GUEST, unregistred user!
我写一个通讯程序,在桌面上放了几个CHECKBOX控件,我希望当我选中一个时,向
串口发送一条命令,当选中两个时,要连续将这两条命令都发送出去,选中三个时
连续发送三条命令。下面这段程序是我在BUTTON1事件中的,可它点一下只发送最后一条。
有位老兄让我把下面的程序放在定时器里,可我发现放了以后它只是不停的发送第一条命令。
还有BUTTON键也用不上了呀。如何解决呀,请HELP ME!谢谢。

IF CHECKBOX1 CHECKED THEN
RICHEDIT。TEXT:=‘AAA’//‘AAA’是指我要发送的命令。

k:=length(richedit1.text);
FillMemory(@sbuf,255,0);
for i:=0 to (k div 2)-1 do
s1:=s1+chr(strtoint('$'+copy(richedit1.text,2*i+1,2)));
p:=Pchar(s1);
CopyMemory(@sbuf,p,Strlen(p));
senddata;
IF CHECKBOX2 CHECKED THEN
RICHEDIT。TEXT:=‘BBB’//‘BBB’是指我要发送的命令。
k:=length(richedit1.text);
FillMemory(@sbuf,255,0);
for i:=0 to (k div 2)-1 do
s1:=s1+chr(strtoint('$'+copy(richedit1.text,2*i+1,2)));
p:=Pchar(s1);
CopyMemory(@sbuf,p,Strlen(p));
senddata;

。。。。。。。



 
用多线程吧!
 
在两次发送之间加上一个延时,下面是延时20MS的例子:
var begin_time:dword;

begin_time:=gettickcount;
while (gettickcount-begin_time<20) do
application.ProcessMessages ;

如果还不行,发EMIAL与我联系 b5790930@pub.xz.jsinfo.net
或QQ:23555873 或 584740
 
procedure TForm1.Button1Click(Sender: TObject);
var
s1:string;
p:pchar;
n:integer;
a,b:dword;
begin_time:dword;




begin

while (gettickcount-begin_time<20) do
application.ProcessMessages ;


if checkbox1.checked= true then
edit1.text:='1111';
k:=length(edit1.text);
FillMemory(@sbuf,255,0);
for i:=0 to (k div 2)-1 do
s1:=s1+chr(strtoint('$'+copy(edit1.text,2*i+1,2)));
p:=Pchar(s1);
CopyMemory(@sbuf,p,Strlen(p));
senddata;
while (gettickcount-begin_time<20) do
application.ProcessMessages ;



begin
if checkbox4.checked= true then
edit1.text:='4444';

k:=length(edit1.text);
FillMemory(@sbuf,255,0);
for i:=0 to (k div 2)-1 do
s1:=s1+chr(strtoint('$'+copy(edit1.text,2*i+1,2)));
p:=Pchar(s1);
CopyMemory(@sbuf,p,Strlen(p));
senddata;



while (gettickcount-begin_time<20) do
application.ProcessMessages ;


begin
if checkbox2.checked= true then
edit1.text:='2222';

k:=length(edit1.text);
FillMemory(@sbuf,255,0);
for i:=0 to (k div 2)-1 do
s1:=s1+chr(strtoint('$'+copy(edit1.text,2*i+1,2)));
p:=Pchar(s1);
CopyMemory(@sbuf,p,Strlen(p));
senddata;

TO TRUECAT 老兄,我按你的方法做了,还是只发送几条相的‘1111’,就是第一个CHECKBOX
选中要发送的命令,其它的没发送,你看我写的是不是你要我做的。






begin
if checkbox3.checked= true then
edit1.text:='3333';


begin
k:=length(edit1.text);
FillMemory(@sbuf,255,0);
for i:=0 to (k div 2)-1 do
s1:=s1+chr(strtoint('$'+copy(edit1.text,2*i+1,2)));
p:=Pchar(s1);
CopyMemory(@sbuf,p,Strlen(p));
senddata;
 
数据从串口发送出去,需要一段时间,这段时间比CPU执行的速度要慢,如果你的命令会有返
回值,则在发送完一条指令后需要等接收完才能发送第二条指令,

思路可以这样进行
TsendClass类中定义sendList命令缓冲区,在发命令的时候实际上是向缓冲区增加命令
在时间循环中检查缓冲区是否为空,不为空,则取一条指令进行发送,完毕后删除此指令即可
 
xasgl 老兄,你所说的我也想到了,就是一定收到返回的命令后才发第二条的,可我的这段程序
我不知道如何改了,我用的是SPCOMM,

procedure TForm1.onreceivedata(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,2)+'';
viewstring:='接收'+viewstring;
memo1.lines.add(viewstring);
memo1.lines.add('');
end;
我也想将上面这段程序加到每条发送命令之后的,可是onreceivedata如何处理呢。
 
SENDBUF是指针类型所以当第一组数据在发送还没来得及写入串口时,数据已经被下面的代码修改
了,下面的SENDBUF可以用SENDBUF1、SENDBUF2等代替,可以采用不是指针的形式,采用静态
数组就可以了
 
问题还没有解决啊,那位老兄写过类似的程序的,请留下QQ号呀,
我的:51551905。
 
你的数据发送是异步的情况下,不能在一个function中解决问题,
在button1click事件中设置bsended := true;isend := 0;
在每个checkbox发送前判断isend<self.tag
判断后设置isend为 checkbox的tag号(指每个设定一个tag号)
在onreceivedata事件中
if bsended then
begin
button1click(Sender);
end;
 
sherman 大哥,你好象是此中高手啊,你的QQ可以告诉我吗,如果有问题再向你请教呀。
但愿你还在这呀。很难碰上一个对此十分精通的热心人呀。
 
procedure TForm1.Button1Click(Sender: TObject);
bsended := true;
isend := 0;
我这样写了以后,运行时,提示:
[Error] COMM.pas(84): Undeclared identifier: 'bsended'
[Error] COMM.pas(84): Undeclared identifier: 'isend'
为什么,那位朋友知道请告诉我,谢谢了,我都急死了,
 
to 逆水
那两个变量是你要定义成全局变量的,
这样的话才可以在整个程序中调用,
用来标志收发情况
在发送的时候使bsended := false;
这样当下一个定时器触发的时候就不会发送数据了
当受到数据的时候使bsended := true;
在定时器下一次出发时就把数据发出去
 
我感到问题的关键好象是你问题的逻辑有问题,
RICHEDIT。TEXT:=‘BBB’//‘BBB’是指我要发送的命令。
k:=length(richedit1.text);
FillMemory(@sbuf,255,0);
for i:=0 to (k div 2)-1 do
此时,K=3,那么(k div 2)-1 = 0 ,
 
感谢大家对我的帮助,但我分太少了,给那位呢。
其实大家讲的都有道理的,但我的具体情况大家可能并没有了解清楚。
在此我谢谢COOK老兄的帮助。发给我他的程序,并帮我改正,真的很感谢啊。
等程序写完后,如果那位朋友想看看我的程序的,我很高兴发给他看看。留下EMAIL就行。
我的QQ:51551905。真的很高兴:我们的身边热心人很多。
谢谢你们。
 
后退
顶部