我用SPComm做的一个实时串口通信的程序。总觉得效果不理想。
我处理串口通信的代码如下:
const
    DELAYBEFOREPROC=200;
var
    comm: TComm;
    g_sendData: Array[1..100] of char;
procedure executeComm(dataLength: Integer);
begin
    if not comm.SendDataEmpty then
        sleep(100);
    comm.WriteCommData(g_sendData,dataLength);
    //iDataLength := 0;
    sleep(DELAYBEFOREPROC);
    application.ProcessMessages;
end;
请大家帮忙下,怎么样才能提高效率?

解决方案 »

  1.   

    问题是不是出在sleep(DELAYBEFOREPROC); 这是非常影响性能的。
      

  2.   

    SPComm 中应该不用 sleep的,
    有事件标示是否已经发送完数据
      

  3.   

    其中没有任何牵涉政治的言论,奇怪。
    我本以为是串口名“comm”引起,把所有的comm改成c omm,也没用。
      

  4.   

    建议不要用spcomm,用cport3,否则死得很难看,这两个用法很想像代码不会改的超过5行,但性能却有天地之别,特别用于实时方面
      

  5.   

    www.cnpack.org
    下一个cnpack的组件包吧...cnrs232...用事件就可以了..
      

  6.   

    把sleep(100);去掉
    sleep(DELAYBEFOREPROC);改成sleep(50)试试。
      

  7.   

    实际上我个人主观认为在这里用SLEEP似乎不合适,我的理解SLEEP用于进程间,而不是内部任务间,或许可以用Applicaton.processmessage试试,如果用Sleep也建议是Sleep(1)而且从代码来看,Sleep的作用无非是:如果发送缓冲区中还有内容的话,闲置一下, 但这里有个问题,你闲置的目的是等缓冲区清空? 还是只是等待200MS,之后就算有数据也继续发送?我认为或许可以这么做(代码我没测试, 紧供参考):
    while not comm.SendDataEmpty do
      Application.ProcessMessage;
      

  8.   

    或者
    while not comm.SendDataEmpty do
      Sleep(1);这样Sleep的时间和次数是根据实际缓冲区的数据决定,而不是不管3721, 就Sleep 200毫秒, 这样100%会出现,无畏Sleep(200)的情况, 比如:你判断的时候只有一个字节还没发送,和还有100个字节还没发送的时间是不一样的。