1、 uartsrc.h 函数指针类型定义void(*funcUartSend)(BYTE *pucSendBuf ,WORD wDataLen);
__packed struct T_UartDgus // 定义结构体类型
{
BOOL bFlagRecv;
BYTE aucTxBuf[UART_DGUS_LEN];
BYTE aucRxBuf[UART_DGUS_LEN];
BYTE ucRecvSta;
BYTE ucRecvCount;
BYTE ucRecvIndex;
void(*funcUartSend)(BYTE *pucSendBuf ,WORD wDataLen); // 定义函数指针 funcUartSend
};
typedef struct T_UartDgus TUartDgus; // 结构体类型起别名 TUartDgus
extern TUartDgus g_tUartDgus; // 定义结构体变量 g_tUartDgus,并声明为外部变量,以供给其它模块调用
2、dgus.c 函数指针的调用,实际就是调用该函数指针指向的函数,并把实参传递过去 g_tUartDgus.funcUartSend( aucDgusCmd, 7 );
void DgusSelectPage( WORD wPicId )
{
BYTE aucDgusCmd[7];
/*帧头*/
aucDgusCmd[0] = DGUS_FRAME_HEADER0;
aucDgusCmd[1] = DGUS_FRAME_HEADER1;
/* 命令长度 */
aucDgusCmd[2] = 0x04;
/* 命令 */
aucDgusCmd[3] = DGUS_CMD_REG_WR;
/* 页面跳转寄存器地址 */
aucDgusCmd[4] = 0x03;
/* 页面ID */
aucDgusCmd[5] = GET_WORD_H( wPicId );
aucDgusCmd[6] = GET_WORD_L( wPicId );
/* 命令发送 */
g_tUartDgus.funcUartSend( aucDgusCmd, 7 ); // 调用函数指针,然后在工程里搜索关键字 funcUartSend, 找到该函数指针具体指向哪个函数,同时把参数(实参aucDgusCmd, 7)也传递过去给指向的那个函数
}
3、uartSrc.c 函数指针的初始化,即该函数指针具体指向哪个函数 ptUartDgus->funcUartSend = Usart3Send;
/**********************************************************
*函数名称: UartDgusInit
*功能描述: Uart - Dgus 初始化
*输入参数: void
*输出参数: void
*返回值 : viod
*其他说明:
**********************************************************/
void UartDgusInit( TUartDgus *ptUartDgus )
{
if(NULL == ptUartDgus)
{
return;
}
ptUartDgus->bFlagRecv = FALSE;
StrClear(ptUartDgus->aucRxBuf, sizeof(ptUartDgus->aucRxBuf));
StrClear(ptUartDgus->aucTxBuf, sizeof(ptUartDgus->aucTxBuf));
ptUartDgus->ucRecvSta = 0;
ptUartDgus->ucRecvCount = 0;
ptUartDgus->ucRecvIndex = 0;
//ptUartDgus->funcRecvFlagClr = UartDgusRecvFlagClr;
//ptUartDgus->funcRecvHandler = UartDgusRecvHandler;
ptUartDgus->funcUartSend = Usart3Send; // 函数指针 funcUartSend 指向函数 Usart3Send,然后再看这个函数 Usart3Send 的具体实现,它的形参就是通过函数指针传过来的
Usart3_Init(115200);
}
4、usart.c 函数指针指向的函数的具体实现,调用函数指针的时候会把实参一起传给函数的形参 void Usart3Send(BYTE *pucSendData, WORD wDataLen)
void Usart3Send(BYTE *pucSendData, WORD wDataLen) // g_tUartDgus.funcUartSend( aucDgusCmd, 7 )
{
WORD wLoop = 0;
for(wLoop = 0; wLoop < wDataLen; wLoop++)
{
USART3->DR = pucSendData[wLoop];
while(FALSE == (USART3->SR & USART3_SR_TXE))
{
;
}
}
}