串口通信,读写效率低,我该怎么做???高手请指招(100分)

  • 主题发起人 主题发起人 yuzhi2005
  • 开始时间 开始时间
Y

yuzhi2005

Unregistered / Unconfirmed
GUEST, unregistred user!
我用DELPHI7和MScomm控件做了上位机监控软件
因为下位机返回的命令字长度不同,所以串口读写采用查询方式:
大体过程是:
1。发读命令
2。sleep(500);
3。读数据
问题就在2。sleep(500)上,这种延时办法cpu占用太大,软件很卡。
我试过delay()函数等大富翁上提到的办法,但是都不好,有人说多线程是个好办法
有做过的高手请指点一下,给些参考的资料和意见
非常感谢,祝大家健康快乐!
我的邮箱jessiyuzhi1125@163.com
 
我觉得你可以使用定时器,准备读取返回的数据。
你也不需要使用sleep了。
如果我是你,会采用这样的方式。
var rec_str:string;//定义一个公共变量。
rec_str:='';//发送命令之前清空。
发送命令;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
1、rec_str:=rec_str+接收的数据 // 把读回来的字符串追加到rec_str后面
2、对rec_tst数据进行分析,确认下位机数据是否接收完成。
end;
 
使用spcomm吧,控制的比较好,不需要使用sleep,有数据的时候自动会触发接收事件。即使使用sleep,cpu也不会占用阿,不过,在sleep前,把控制权回交给系统就可以了
 
zywcd,我试过了,没有调通,Timer本身的定时不准确,不是很好控制
 
jamcky,请问如何交出控制权??
 
Application.ProcessMessages;
Sleep(500);
 
jamcky,这种方式我试过了,虽然交出了控制权,但是系统会执行后面的接收语句,而现在的数据还没有读上来啊
 
这样的场合使用定时器不需要准确。你需要可以把数据完整读回来就好。
 
zywcd,你说的很对,但是总是调不通,我看到有个APRO控件好像很强大,你听说过没有???
 
Mscomm我没用过,要使实在没办法,那你就开一个线程读取数据吧,不过当串口多时,这种不好控制,也可以尝试运用事件触发的等待模式(WaitforSingleobject)试一试,这种比sleep好
 
我们实验室10点关门,希望明天能再和你们讨论这个问题,谢谢啊
 
WaitforSingleobject,能给说的详细一点吗??你做过这方面的程序啊
 
我不知道你怎么调试的,这样的应该不难。关键是你是否可以判断下位机信息是否结束。
 
我的通信协议订的挺简单,没有办法知道下位机是否传完数据
 
通信协议里应该有数据长度。如果没有办法知道下位机是否传完数据,就不好办
 
我听说SPcomm控件不需要设定延时,都是接收到数据后触发接收事件执行的,有没有朋友用过啊???
 
网上有很多例程
 
以前做串中,我是这样的
做个实时读取数据的,读到的数据放到一个阵列中,然后再写代码去分析这个阵列!做你的后期相关的操作
 
我现在要读16台下位机的数据,用MSCOMM我实在是没有办法了,效率太低。大家有什么建议啊??
 
多人接受答案了。
 
后退
顶部