void *pdata的理解分析



形式参数变量[L3.1(1)]是由用户代码在第一次执行的时候带入的。请注意,该变量的
类型是一个指向void的指针。这是为了允许用户应用程序传递任何类型的数据给任务。这
个指针好比一辆万能的车子,如果需要的话,可以运载一个变量的地址,或一个结构,甚至
是一个函数的地址。也可以建立许多相同的任务,所有任务都使用同一个函数(或者说是同
一个任务代码程序), 见第一章的例1。例如,用户可以将四个串行口安排成每个串行口都
是一个单独的任务,而每个任务的代码实际上是相同的。并不需要将代码复制四次,用户可
以建立一个任务,向这个任务传入一个指向某数据结构的指针变量,这个数据结构定义串行
口的参数(波特率、I/O口地址、中断向量号等)。

``` char PcdWrite ( uint8_t ucAddr, uint8_t * pData ) { char cStatus; uint8_t uc, ucComMF522Buf [ MAXRLEN ]; uint32_t ulLen; ucComMF522Buf [ 0 ] = PICC_WRITE; ucComMF522Buf [ 1 ] = ucAddr; CalulateCRC ( ucComMF522Buf, 2, & ucComMF522Buf [ 2 ] ); cStatus = PcdComMF522 ( PCD_TRANSCEIVE, ucComMF522Buf, 4, ucComMF522Buf, & ulLen ); if ( ( cStatus != MI_OK ) || ( ulLen != 4 ) || ( ( ucComMF522Buf [ 0 ] & 0x0F ) != 0x0A ) ) cStatus = MI_ERR; if ( cStatus == MI_OK ) { //memcpy(ucComMF522Buf, pData, 16); for ( uc = 0; uc < 16; uc ++ ) ucComMF522Buf [ uc ] = * ( pData + uc ); CalulateCRC ( ucComMF522Buf, 16, & ucComMF522Buf [ 16 ] ); cStatus = PcdComMF522 ( PCD_TRANSCEIVE, ucComMF522Buf, 18, ucComMF522Buf, & ulLen ); if ( ( cStatus != MI_OK ) || ( ulLen != 4 ) || ( ( ucComMF522Buf [ 0 ] & 0x0F ) != 0x0A ) ) cStatus = MI_ERR; } return cStatus; } /** * @brief 读取M1卡一块数据 * @param ucAddr,块地址(0-63)。M1卡总共有16个扇区(每个扇区有:3个数据块+1个控制块),共64个块 * @param pData,读出的数据,16字节 * @retval 状态值= MI_OK,成功 */ char PcdRead ( uint8_t ucAddr, uint8_t * pData ) { char cStatus; uint8_t uc, ucComMF522Buf [ MAXRLEN ]; uint32_t ulLen; ucComMF522Buf [ 0 ] = PICC_READ; ucComMF522Buf [ 1 ] = ucAddr; CalulateCRC ( ucComMF522Buf, 2, & ucComMF522Buf [ 2 ] ); cStatus = PcdComMF522 ( PCD_TRANSCEIVE, ucComMF522Buf, 4, ucComMF522Buf, & ulLen ); if ( ( cStatus == MI_OK ) && ( ulLen == 0x90 ) ) { for ( uc = 0; uc < 16; uc ++ ) * ( pData + uc ) = ucComMF522Buf [ uc ]; } else cStatus = MI_ERR; return cStatus; } /** * @brief 判断 ucAddr 是否数据块 * @param ucAddr,块绝对地址(0-63) * @retval 返回值 1:是数据块;0:不是数据块 */ char IsDataBlock( uint8_t ucAddr ) { if(ucAddr == 0) { printf("第0扇区的块0不可更改,不应对其进行操作\r\n"); return 0; } /* 如果是数据块(不包含数据块0) */ if( (ucAddr<64) && (((ucAddr+1)%4) != 0) ) { return 1; } printf("块地址不是指向数据块\r\n"); return 0; } /** * @brief 写 pData 字符串到M1卡中的数据块 * @param ucAddr,数据块地址(不能写入控制块) * @param pData,写入的数据,16字节 * @retval 状态值= MI_OK,成功 */ char PcdWriteString ( uint8_t ucAddr, uint8_t * pData ) { /* 如果是数据块(不包含数据块0),则写入 */ if( IsDataBlock(ucAddr) ) { return PcdWrite(ucAddr, pData); } return MI_ERR; } /** * @brief 读取M1卡中的一块数据到 pData * @param ucAddr,数据块地址(不读取控制块) * @param pData,读出的数据,16字节 * @retval 状态值= MI_OK,成功 */ char PcdReadString ( uint8_t ucAddr, uint8_t * pData ) { /* 如果是数据块(不包含数据块0),则读取 */ if( IsDataBlock(ucAddr) ) { return PcdRead(ucAddr, pData); } return MI_ERR; } /** * @brief 命令卡片进入休眠状态 * @param 无 * @retval 状态值= MI_OK,成功 */ char PcdHalt( void ) { uint8_t ucComMF522Buf [ MAXRLEN ]; uint32_t ulLen; ucComMF522Buf [ 0 ] = PICC_HALT; ucComMF522Buf [ 1 ] = 0; CalulateCRC ( ucComMF522Buf, 2, & ucComMF522Buf [ 2 ] ); PcdComMF522 ( PCD_TRANSCEIVE, ucComMF522Buf, 4, ucComMF522Buf, & ulLen ); return MI_OK; }```解释代码
03-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值