c++设计者模式,串口中断举例

其实这玩意真的简单,但是网上资料都看不明白,如果新手在工作中遇到了这种设计模式的软件,直接问源代码作者吧,他随便讲几句话就明白了。百度上的资料都是抄来吵去,辣鸡。而且代码又臭又长,根本看不懂,本文也很可能看不懂。 正文:在我的实际工程中挑选了关键代码出来,来分析串口这一块。

首先定义中断类包括串口,然后串口的中断来的时候,串口中断观察者-IInterruptObserver收到一个字节,同时把它发送给它的”上级“观察者-IUartObserver,只是它没有告诉IUartObserver做什么,让IUartObserver自己写一个成员函数来处理,同时,IUartObserver可以有不同的派生类,派生类的对象可以做自己想做的事情。

/*************************
类定义:中断
**************************/
class CInterrupt
{
 private:
  IInterruptObserver* IsrObsever[5];
 public:
  static CInterrupt* Instance();
  
  void RegisterObsever(ISRn_Type type,IInterruptObserver* observers)
  {
   IsrObsever[type]=observer;
  }
  
  void IRQHandler(ISRn_Type type)
  {
   if(IsrObsever[type])
   {
    IsrObsever[type]->OnInterrupt(type);//中断到来,调用中断观察者的OnInterrupt函数
   }
  }
}
/*************************
类定义:串口中断观察者
**************************/
class CUsart: public IInterruptObserver//中断观察者
{
 public:
  static CUsart* Instance()
  {
   static CUsart* instance;
   return &instance;
  }
  void RegisterObsever(IUartObsever* obsever)//串口观察者注册
  {
  m_Obervers.push_back(observers);
  }
  
  void OnInterrupt(ISRn_Type)
  {
   char ch=USART_ReceiveData();//串口观察者的OnInterrupt函数:读取串口来的一个字节
   for (UartObserverList::iterator iter = m_Observers.begin(); iter != m_Observers.end(); ++iter)
    {
    //所有注册某一个uart的观察者,都运行OnReceived     
    (*iter)->OnReceived(this, ch);
    }   }  
 private:
  UartObserverList m_Obervers;
} /*****************************
类定义:上面串口观察者的观察者
*****************************/
class IUartObserver
{
public:
 IUartObserver()
 {
 CUsart::Instance->RegisterObsever(this);
 }
 virtual void OnReceived(CUsart* usart, uint16_t ch)=0;//定义一个纯虚函数
} class ProcessA :public IUartObserver
{
public:
 void OnReceived(CUsart* usart, uint16_t ch)
 {
 FunctionA();//ProcessA类对象 要做的事情…….
 }
} class ProcessB :public IUartObserver
{
public:
 void OnReceived(CUsart* usart, uint16_t ch)
 {
 FunctionB();//ProcessA类对象 要做的事情…….
 }
} typedef std::list<IUartObserver*> UartObserverList;//列表 /*********************************
中断处理函数
功能:此为stm32平台的中断函数格式
***********************************/
void EXIT9_5_IRQHandler(void)
{
 CInterrupt::Instance()->IRQHandler(EXIT9_5_IRQHandler);
} void TIM5_IRQHandler(void)
{
 CInterrupt::Instance()->IRQHandler(TIM5_IRQHandler);
}
 
void USART1_IRQHandler(void)
{
    CInterrupt::Instance()->IRQHandler(USART1_ISRn);
} void USART2_IRQHandler(void)
{
    CInterrupt::Instance()->IRQHandler(USART2_ISRn);
}
/*************************************
主函数
功能:初始化对象
*************************************/ void main()
{
 ProcessB B;
 ProcessA A;
}

来源:李嗷纳多

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2018年4月26日
下一篇 2018年4月26日

相关推荐