我在Button.Click事件中进行了Comm1.Write的操作,为什么只有等到程序执行完了Button.Click事件,才触发了Comm1.ReceiveData事件了,有没有办法在Button.Click中就能接收数据了!~~~部分程序如下
procedure TForm1.SendData_ButtonClick(Sender: TObject);
var buffer:string;
begin
  ReadChar(Comm1,256,2,pchar(buffer));
  //Comm1为spcomm,256为起始地址,2为读取数据长度,读的数据存到buffer中。
end;

解决方案 »

  1.   

    试试
    Application.Processmessages;
    Sleep(100);
      

  2.   

    借楼主一块宝地:
      这个问题是有的,发送的过程结束之后才会执行其他的事件过程,我现在也有同样的困惑,不过你说的哪个问题,我在应用程序里用其他变通的方法给处理了,我现在有一个问题是,在DLL里处理发送数据,接收不好处理了,而且,需要在VB,VC里调用这个DLL,他们可能没有SPCOMM,呵呵,不知道到底怎么处理了,
    试试
    Application.Processmessages;
    Sleep(100);这种方法我以前也尝试过了,只是它也是执行完这个过程才会去执行其他的过程,不过我没尝试用GOTO语句,估计GOTO可以,但我不敢贸然使用,
    楼主也找一种变通的方法把
      

  3.   

    goto不行。不能在一个函数中转向另一个函数。
      

  4.   

    我觉得这是不可能的.串口是半双工的,不可能即接收又发送.而且ONRECEIVEDATA是个回调函数,只有当收到数据时会触发这个事件,你不可能去主动的调用它.你的程序只所以等到发命令之后再触发那个收数事件时因为你的发命令和接收数据都在主线程里面,不可能同时响应.
      

  5.   

    我的意思是在发送完所有的数据之后,
    sleep(50);
    然后再去跳转可以不?对了,有人知道,什么情况下才可以触发COMM的接收事件不?
      

  6.   

    谢谢各位朋友的提示,现在可以在Button.Click中接受数据了,使用Application.Processmessages;就能实现这个功能了。因为spcomm读数据是开了个线程读的,所以只有Button.Click处理完后 才会处理ReceiveData事件,因此最简单的办法就是使用Application.ProcessMessages;来中断Button.Click转而调用ReceiveData。但这个方法还是不完美,最好不要在主线程中处理,再开一个线程来处理Button.click要处理的程序,主线程不返回是不能处理别的线程的。具体就要看一下多线程,和windows消息处理了,哎,学习学习再学习。
      

  7.   

    To:lsh_ahjz(我爱DELPHI)
    我开始也象你一样,想用Dll来实现串口数据的读写,但是如果在其中用spcomm我觉得不好写就没有用Dll了。我想要用Dll的话就应该使用api函数来实现功能了(一家之言哈。)我对api不熟,帮不了你了!~
      

  8.   

    分别开线程进行读写,spcomm应该能达到你的要求,那东西本身就是多线程的
      

  9.   

    shine_wy(shine_wy) :
    Application.Processmessages是什么意思?这样就能发送命令和接收数据同步执行了吗?
    getit911(Windows转Linux中) :
    你说spcomm本身就是多线程,可体现在哪里?还有,我看有的帖子说,可以让spcomm的缓冲区达到一定大小后再一起接收数据,还可以改变缓冲区的大小,这个是怎么实现的?
      

  10.   

    我的意思是Application.Processmessages可以中断当前的线程转而执行其他的线程。
    你看spcomm的代码,你就会知道为什么他是多线程的了。