首先定义中断类包括串口,然后串口的中断来的时候,串口中断观察者-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进行处理,非常感谢!