新手,遇到难题。在串口通讯中,全局函数获得数据后将其放入缓存区,局部函数要到缓存区取数处理。有两个方案:
    第一种,局部函数计数一定时间后到缓存区取数,但由于此方案的计数(计时)精度有限,随着时间的增加,计时误差会扩散,不适合我现在面临的高数据率(115200及以上的波特率)和长时间的处理。
    因此只剩下第二种,全局函数将数据放入缓存区之后触发局部函数到缓存区取数。但我现在使用的全局函数没有返回值,我怎样才能触发局部函数呢?跟人沟通过,说是可以通过消息、事件什么的触发。但我不知道怎么实现?
希望高手能帮我解决问题,谢谢!

解决方案 »

  1.   

    自己建立一个进程:
    UINT MyProc(LPVOID pParam)

       CXXXDlg *pDlg=(CXXXDlg*)pParam;   pDlg->func()//主Dlg你想使用的函数
    }注意:数据处理函数,监视串口函数,别放在pDlg里面,影响主界面的显示效率的
      

  2.   

    首先,定时器去取是不可行的,这个方法直接可以否定,因为定时太短,占cpu高,定时太长,响应时间长。
    其次有两个解决方案:
    1.接收到数据后,直接调用局部函数处理,不要放到缓冲区中。
    2.创建一个接收队列作为缓冲区,创建一个事件,启动一个处理线程(你说的局部处理函数)
    处理线程的逻辑:进入临界区(加锁)
    while(队列中存在数据)
    {
        数据出队
         处理
    }
    else
    {
        事件设置为无信号状态
        出临界区(解锁)
        WaitForSingleObject(hEvent);//等待事件
    }接收的逻辑:加锁
    接收的数据加入队列
    设置事件为有信号状态,使得处理线程立即结束Wait,处理队列中的数据
    解锁总之需要一个临界区和一个事件来处理线程同步,临界区保护队列不被同一时间访问,以免造成冲突。事件用于通知队列中有数据时,立即处理,就避免了你定时器去定期查询造成的效率问题,和不及时问题。
      

  3.   

    修正一下
    while(TRUE)
    {
       进入临界区(加锁)
       if(队列中存在数据)
       {
          数据出队
           出临界区(解锁)
           处理
       }
       else
       {
         事件设置为无信号状态
          出临界区(解锁)
           WaitForSingleObject(hEvent);//等待事件,直到接收收到数据后,将其设置为有信号状态
        }
    }
      

  4.   

    1 如果对有窗口的类,可以使用全局的窗口句柄 HWND hWndProcessData = NULL; 在打开串口或初始化这个窗口指针,全局函数就可以用这个窗口句柄发送消息
    2 可以添加一个全局的回调函数指针和使用类的指针, 在使用类中添加静态函数,全局函数中可以调用这个提供的回调函数,  如 typedef BOOL (CALLBACK *CALLBACKPROC)(LPVOID pUser, LPBYTE pBuff, DWORD dwBuffSize);
      CALLBACKPROC pCallbackProc = NULL;
      LPVOID pUser = NULL;
      
      //全局函数
      GlobalFun()
      {
        ……
        if(pCallbackProc && pUser)
        {
          pCallbackProc(pUser, buffer, buffsize);
        }
      }  //局部函数
      class User
      {
        static BOOL CALLBACK ProcFun(LPVOID pUser, LPBYTE pBuff, DWORD dwBuffSize)
        {
          User *pThisClass = (User*)pUser;
          //处理数据
        }     void InitFun()
        {
          //其它初始化代码      pCallbackProc = ProcFun;
          pUser = this;           
        }
      };3 可以用事件,全局函数中SetEvent,局部使用启动一个线程等待事件