关于通讯方面的原代码网上有很多,其中以“串口调试助手”比较
的有名,它无非是当命令发送出去后,让返回信息促发 onreceive事件,
把返回的信息显示出来。这是是一种很典型的应用,它适合于调试的环境,
而且效率很高。
但我们知道,还有一种方式就是“查询方式”,这种方式的特点就是控制简单,
但效率低。 我们的程序一般都是在自动运行,不可能知道命令发出后什么时候有信息返回,然后再发底二条
特别是当有多条命令需要安顺序发送时,如果按第一种方式通讯,相当不好控制
而用第二种方式发送,效率却很低下,而且它不能接受主动的上传信息。
我想对于上面的问题,大家已经有了很好的解决方案,能否赐教!!!!!
的有名,它无非是当命令发送出去后,让返回信息促发 onreceive事件,
把返回的信息显示出来。这是是一种很典型的应用,它适合于调试的环境,
而且效率很高。
但我们知道,还有一种方式就是“查询方式”,这种方式的特点就是控制简单,
但效率低。 我们的程序一般都是在自动运行,不可能知道命令发出后什么时候有信息返回,然后再发底二条
特别是当有多条命令需要安顺序发送时,如果按第一种方式通讯,相当不好控制
而用第二种方式发送,效率却很低下,而且它不能接受主动的上传信息。
我想对于上面的问题,大家已经有了很好的解决方案,能否赐教!!!!!
应该重发命令(1),依次类推,我如何选用第一种方式进行通讯,要知道用第一种方式的
优点是很多的!!!
type TCMD=record
bury:boolean;
cmd:byte; //你要发送的字节,长度可以自定
end;....
var sMessage:TCMD;
....procedure Tform1.add(b:byte);
var i:integer;
begin
if (High(sMessage)=0)and(sMessage.bruy=false) then
begin
setlength(sMessage,1);
sMessage[0].bruy:=true;
sMessage[0].cmd:=b;
try
if Thread1.Suspended then
begin
Thread1.Resume;
end;
except
end;
end
else
begin
setlength(sMessage,High(sMessage)+2);
sMessage[High(sMessage)].cmd:=d ;
sMessage[High(sMessage)].bruy:=true ;
try
if Thread1.Suspended then
begin
Thread1.Resume;
end;
except
end;
end;
end;procedure Tform1.Comm1ReceiveData(Sender: TObject;
Buffer: Pointer; BufferLength: Word);
var i:integer;
begin
//可以在这里加一个反馈判断
...
for i:=0 to high(sMessage) do
begin
if sMessage[i].bruy=true then
begin
sMessage[i].bruy:=false;
end;
application.ProcessMessages; //不至于占太多系统资源
end;
...
end;//=============以下为线程内容=====================
function sendmessage;
begin
for i:=0 to high(sMessage) do
begin
if sMessage[i].bury then
begin
//发送sMessage[i].cmd命令
exit;
end;
end;
setlength(sMessage,1);
sMessage[0].bruy:=false;
sMessage[0].cmd:=byte(0);
end;procedure Thread1.Execute;
begin
while not Terminated do
begin
try
sendmessage;
Application.ProcessMessages;
sleep(2000);
except
end;
end;
end;
要有一些详细得例子,什么书好?
这里面有你想要的所有实例。delphi新增的控件用法及实例都在这里。用不着求人,
将 FORM 的 TOP 属性改一下就行了。