C语言学习 -- 函数指针

文章描述了一个使用STM32的UART接口与DGUS设备通信的过程。通过定义一个包含函数指针的结构体T_UartDgus,其中的funcUartSend指针被初始化为Usart3Send函数。在DgusSelectPage函数中,通过此指针调用发送函数,向USART3发送数据。Usart3Send函数实现了将数据写入USART3的DR寄存器进行串行传输。
摘要由CSDN通过智能技术生成

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))
		{
			;
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值