不是很明白..唉...比如:串行口..缓冲区内现有1000个字节内容.......
怎么样设计这个多线程来快速读取这1000个字节..线程数在2个以上(注明:串行缓冲区在读取一个数后.缓冲内字节就少去一下....属于..队列方式的..)
请高手帮帮忙....小弟用于实时数据采集.
下位机以37KHZ频率采集...时间间隔为:27us   但是PC端的串口读读取速度不行...达不到实时...  怎么才可以达到高速读取呢...唉..说实话.37KHZ并不是什么高速了.

解决方案 »

  1.   

    提高串口速度,115200bps应该够快了。
    用spcomm控件,spcomm本身就是多线程的,加大spcomm缓冲(默认是4K)。
      

  2.   

    >>而且以19200的速度上传..都读的比较慢....还怎么用115200
    115200要比19200的速度快的多的多。首先要确定每秒发送到PC串口的数据量有多大,然后确定一个合适波特率。
      

  3.   

    我改改了代码...速度是读的速度是不成问题了..但是..在暂停线程时就会出错..也不知道为什么.我把相关的代码帖出来...(小鸟.....你在干什么.)
    //////////////部分变量的申明.
    var
     PulckPulseThread:array[1..2] of TPulckPulseThread;
      ReadIndex:integer;//读取指针
      PulckPulse_RBuf: byte;//保存读取记录
      CBuf:array[1..2000] of byte;//保存读取转换后的数值
      ReadArray:array of byte;
      len,i:integer;
    .........
    { TPulckPulseThread }
    //==============================================================================
    // 线程处理部分.
    //==============================================================================
    procedure TPulckPulseThread.Execute;
    begin
     FreeOnTerminate:=true;
     while (not Terminated) do
      begin
         EnterCriticalSection(CS);
         setLength(readarray,5000);
         McuComm.ReadComm_MaxSize(ComNo,ReadArray,len);
         if len>0 then
         begin
             setLength(readarray,len);
             for i:=low(readarray) to high(readarray) do
             begin
              postMessage(pluckForm.Handle,WM_MCU_IrDA,readarray[i],0);
             end;
         end;
        // application.ProcessMessages;
         LeaveCriticalSection(CS);
     end;
    end;======================暂停线程处理========================================
    procedure TMCUCtr.PluckPulseStop;
    begin
       MCUCMD[1]:=$0C;
       MCUCMD[2]:=$00;
       MCUCMD[3]:=$00;//TH0
       MCUCMD[4]:=$ff;//TL0
       mcucomm.SendArrayByte(MCUCMD);
       mcucomm.ClearComBuf(comNO);//清空缓冲区
      for mod_i:=low(PulckPulseThread) to high(PulckPulseThread) do
      begin
         if PulckPulseThread[i].Suspended=false then
         PulckPulseThread[i].Suspend;
      end;
    end;
    =========================================================================
    =========================================================================
    其它代码就略过去了....这里启动一切正常....下位机以40KHZ采集率频......并以19200bpf速率上传..... 当我暂停这几个线程时...就出现错误了:  (错误指下面)
         for mod_i:=low(PulckPulseThread) to high(PulckPulseThread) do
      begin
         if PulckPulseThread[i].Suspended=false then
         PulckPulseThread[i].Suspend;
      end;=========
     我把:下面这2个变量...放在procedure TPulckPulseThread.Execute; 里..则可以正常轻描暂停该线程....
      ReadArray:array of byte;
      len,i:integer;
    ==================我不知道为什么...想不通..
      

  4.   

    >>怎么样设计这个多线程来快速读取这1000个字节..
    我的理解,用多线程反而慢
      

  5.   

    >>我的理解,用多线程反而慢我只是举个例子实际怎么会只有1000个字节。。下位采集系统是不断上传的。。40KHZ的话。。就是27us速度向上传送..速度上面的问题..我已经用多线程解决了.....只是我不知道暂停时怎么会出错.
      

  6.   

    =========
     我把:下面这2个变量...放在procedure TPulckPulseThread.Execute; 里..则可以正常轻描暂停该线程....
      ReadArray:array of byte;
      len,i:integer;
    ==================怎么可能? 
    全局变量与局部变量会导致出错? 会不会是你终止线程时没有释放导致的?
      

  7.   

    if PulckPulseThread[i].Suspended=false then
         PulckPulseThread[i].Suspend;
    我只是去暂停这几个线程........并没有去终止他..
      

  8.   

    我一直在线。。请大家时刻观注。。HOHO
      

  9.   

    那你试试在暂停的时候释放一个array呢
      

  10.   

    我把错误代码帖出来:project Project1.exe raised exception class EaccessViolation with message 'Access violation at address 004AD1D8 in module 'Project1.exe.Read of address 0000000E', 
    Process stopped use Step or Run to continue.
      

  11.   

    for mod_i:=low(PulckPulseThread) to high(PulckPulseThread) do
      begin
         if PulckPulseThread[i].Suspended=false then
         PulckPulseThread[i].Suspend;
      end;这里的i应该是mod_i吧?
      

  12.   

    我把..那2个变量放到....  //--------时序采集线程--------
      TPulckPulseThread=class(TThread)
      private
        // procedure PluckThread;
          ReadArray:array of byte;
         len:integer;
      protected
        procedure Execute;override;
      end;
    这样在关闭后..就没有出错了.
      

  13.   

    100KHZ...速度还行...用单线程..也可以解决了....唉...怪不得速度咱那样慢.出在那个mod_i身上....郁闷ing......
    单线程的话...其最大循环花去多少时间呢?