精华内容
下载资源
问答
  • VC++ HIDAPI实现USB数据读写

    热门讨论 2018-09-17 08:51:33
    资源自动涨价,楼主也没办法改 win32 hidapi实现对usb设备尽心数据,包括热拔插;项目是vs2013项目; hidapi是一个开源项目可从这里下载 https://github.com/signal11/hi
  • 该资源为ddr3数据读写代码工程,由vivado2018.2编写。低版本的软件请参考附带的教程,自行配置ip核。开发板为ax7035,芯片为xc7a35tfgg484,ddr3芯片为16bit位宽,直接上板使用,其他芯片需更改相关输入输出管脚。...
  • las数据读写

    2016-01-04 16:17:32
    机载激光雷达的LAS数据读写代码实现过程。
  • STM32+MFRC522完成IC卡号读取、密码修改、数据读写

    千次阅读 多人点赞 2021-05-20 14:36:48
    使用MFRC522模块完成对IC卡卡号读取、卡类型区分、IC卡扇区密码修改、扇区数据读写等功能;底层采用SPI模拟时序,可以很方便的移植到其他设备,完成项目开发。 现在很多嵌入式方向的毕业设计经常使用到该模块,比如:...

    一、环境介绍

    MCU:  STM32F103ZET6

    开发软件: Keil5

    非接触式读写卡模块: MFRC522

    完整工程源码下载: https://download.csdn.net/download/xiaolong1126626497/18905806

    二、功能介绍

    使用MFRC522模块完成对IC卡卡号读取、卡类型区分、IC卡扇区密码修改、扇区数据读写等功能;底层采用SPI模拟时序,可以很方便的移植到其他设备,完成项目开发。  现在很多嵌入式方向的毕业设计经常使用到该模块,比如: 校园一卡通设计、水卡充值消费设计、公交卡充值消费设计等。

    三、MFR522介绍

    MF RC522 是应用于13.56MHz 非接触式通信中高集成度读写卡系列芯片中的一员。是NXP 公司针对“三表”应用推出的一款低电压、低成本、体积小的非接触式读写卡芯片,是智能仪表和便携式手持设备研发的较好选择。

    MF RC522 利用了先进的调制和解调概念,完全集成了在13.56MHz 下所有类型的被动非接触式通信方式和协议。支持 ISO14443A 的多层应用。其内部发送器部分可驱动读写器天线与ISO 14443A/MIFARE卡和应答机的通信,无需其它的电路。接收器部分提供一个坚固而有效的解调和解码电路,用于处理ISO14443A 兼容的应答器信号。数字部分处理ISO14443A 帧和错误检测(奇偶 &CRC)。此外,它还支持快速CRYPTO1 加密算法,用于验证MIFARE 系列产品。MFRC522 支持MIFARE?更高速的非接触式通信,双向数据传输速率高达424kbit/s。

    作为13.56MHz 高集成度读写卡系列芯片家族的新成员,MF RC522 与MF RC500和 MF RC530 有不少相似之处,同时也具备诸多特点和差异。它与主机间的通信采用连线较少的串行通信,且可根据不同的用户需求,选取SPI、I2C 或串行UART(类似RS232)模式之一,有利于减少连线,缩小PCB 板体积,降低成本。

    四、IC卡介绍

    非接触式IC卡又称射频卡,由IC芯片、感应天线组成,封装在一个标准的PVC卡片内,芯片及天线无任何外露部分。是世界上最近几年发展起来的一项新技术,它成功的将射频识别技术和IC卡技术结合起来,结束了无源(卡中无电源)和免接触这一难题,是电子器件领域的一大突破。卡片在一定距离范围(通常为5—10cm)靠近读写器表面,通过无线电波的传递来完成数据的读写操作。

    射频读写器向IC卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与读写器发射的频率相同,这样在电磁波激励下,LC谐振电路产生共振,从而使电容内有了电荷;在这个电荷的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内存储,当所积累的电荷达到2V时,此电容可作为电源为其它电路提供工作电压,将卡内数据发射出去或接受读写器的数据。

    非接触性IC卡与读卡器之间通过无线电波来完成读写操作。二者之间的通讯频率为13.56MHZ。非接触性IC卡本身是无源卡,当读写器对卡进行读写操作时,读写器发出的信号由两部分叠加组成:一部分是电源信号,该信号由卡接收后,与本身的L/C产生一个瞬间能量来供给芯片工作。另一部分则是指令和数据信号,指挥芯片完成数据的读取、修改、储存等,并返回信号给读写器,完成一次读写操作。读写器则一般由单片机,专用智能模块和天线组成,并配有与PC的通讯接口,打印口,I/O口等,以便应用于不同的领域。

    M1卡详细指标

    M1卡是指M1芯片,是指菲利浦下属子公司恩智浦出品的芯片缩写,全称为NXP Mifare1系列,常用的有S50及S70两种型号。

    M1(S50)卡详细规格:

    1. 芯片类型:PhilipsMifare1ICS50
    2. 存储容量:8Kbit,16个分区,每分区两组密码;
    3. 工作频率:13.56?MHz;
    4. 通讯速率:106KBoud;
    5. 读写距离:2.5~10cm;
    6. 读写时间:1~2ms;
    7. 工作温度:-20℃~55℃;
    8. 擦写寿命:>100,000次;
    9. 数据保存:>10年;
    10. 外形尺寸:ISO标准卡85.6x54x0.82;
    11. 封装材料:PVC、PET、PETG、0.13mm铜线;

    Mifare S50和Mifare S70又常被称为Mifare Standard、Mifare Classic、MF1,是遵守ISO14443A标准的卡片中应用最为广、影响力最大的的一员。而Mifare S70的容量是S50的4倍,S50的容量是1K字节,S70的容量为4K字节。

    读写器对卡片的操作时序和操作命令,二者完全一致。    Mifare S50和Mifare S70的每张卡片都有一个4字节的全球唯一序列号,卡上数据保存期为10年,可改写10万次,读无限次。一般的应用中,不用考虑卡片是否会被读坏写坏的问题,

    当然暴力硬损坏除外。 Mifare S50和Mifare S70的区别主要有两个方面。一是读写器对卡片发出请求命令,二者应答返回的卡类型(ATQA)字节不同。Mifare S50的卡类型(ATQA)是0004H,Mifare S70的卡类型(ATQA)是0002H。另一个区别就是二者的容量和内存结构不同。

    M1卡分为16个扇区,每个扇区由4块(0、1、2、3)组成。实际操作时,将16个扇区分为64个块,按绝对地址编号为0-63。

    结构如下:

     

    1. 第0个扇区用于存放厂商代码,意见固话,不可更改。
    2. 每个扇区的块0、块1、块2为数据块,可以用于存储数据。数据块可以进行读写操作。
    3. 每个扇区的块3为控制块,包括了密码A、存储控制、密码B。具体结构如下:

      4. 每个扇区的密码和控制位都是独立的,可以根据实际需求设定各自的密码及存取控制。存取控制为4个字节,共32位,扇区中的每个块(包括数据和控制块)存取条件是由密码和存取控制共同决定的,在存取控制中每个块都有一个相应的三个控制位。定义如下:

     Mifare 1 S50 白卡读写时一般步骤: 寻卡-->下载块密码--> 读写块数据。控制块也是一样。

     

         数据块的访问权限设置表格:(根据自己需要的权限,完成上图字节6、7、8的填充即可)

       控制块的读写权限设置:(包含了对密码A、控制权限、密码的读写权限)

     

     

     

               7  6  5  4  3  2  1  0

    字节6 1  1  1  1  1  1  1  1

    字节7 0  0  0  0  1  1  1  1

    字节8 0  0  0  0  0  0  0  0

    字节9

    设置的控制权限如下:0xFF 0x0F 0x00 0x00

    代表数据块的权限: 验证密码A或者密码B都可以对数据块进行读写操作或者加值键值操作。

    2. 代表控制块的权限

    (1) 验证A密码之后可以写A/B密码,不能读密码。

                         可以读控制字节(4个),无法写控制字节

                          可以读写B密码       

    (2) 验证B密码之后,可以读写A/B密码,也可读控制字节,但无法写控制字节。   

     

    五、核心代码

    5.1  rc522.c

    #include "sys.h"
    #include "RFID_RC522.h"
    #include "delay.h"
    #include "string.h"
    #include "usart.h"
    
    /*
    函数功能:移植接口--SPI时序读写一个字节
    函数参数:data:要写入的数据
    返 回 值:读到的数据
    */
    u8 RC522_SPI_ReadWriteOneByte(u8 tx_data)
    {			  	 
    	u8 rx_data=0;				 
      u8 i;
      for(i=0;i<8;i++)
    	{
    		RC522_SCLK=0;  
    		if(tx_data&0x80){RC522_OUTPUT=1;}
    		else {RC522_OUTPUT=0;}
    		tx_data<<=1;	
    		RC522_SCLK=1;
    		rx_data<<=1;
    		if(RC522_INPUT)rx_data|=0x01;
    	}
    	return rx_data; 
    }
    
    
    /*
    函数功能:初始化RC522的IO口	 
    */
    void RC522_IO_Init(void)
    {
    	RCC->APB2ENR|=1<<2;     //PA时钟使能 
    	RCC->APB2ENR|=1<<7;     //PF时钟使能
    	
    	//PA5  时钟 RC522_SCLK
    	//PA6  输入 RC522_INPUT
    	//PA7  输出 RC522_OUTPUT 
    	GPIOA->CRL&=0x000FFFFF;
    	GPIOA->CRL|=0x38300000;
    	GPIOA->ODR|=0x3<<5;
    	
    	//RC522_RST <----->PF1--复位脚
    	//RC522_SDA <----->PF0--片选脚
    	GPIOF->CRL&=0xFFFFFF00;
    	GPIOF->CRL|=0x00000033;
    	GPIOF->ODR|=0x3<<0;
    }	
    
    
    /*
    功能描述:选卡读取卡存储器容量
    输入参数:serNum 传入卡序列号
    返 回 值:成功返回卡容量
    */
    u8 RC522_MFRC522_SelectTag(u8 *serNum) //读取卡存储器容量
    {     
    	u8 i;     
    	u8 status;     
    	u8 size;     
    	u8 recvBits;     
    	u8 buffer[9];
    	     
    	buffer[0]=PICC_ANTICOLL1;	  //防撞码1     
    	buffer[1]=0x70;
    	buffer[6]=0x00;						     
    	for(i=0;i<4;i++)					
    	{
    		buffer[i+2]=*(serNum+i);	//buffer[2]-buffer[5]为卡序列号
    		buffer[6]^=*(serNum+i);	  //卡校验码
    	}
    	
    	RC522_CalulateCRC(buffer,7,&buffer[7]);	//buffer[7]-buffer[8]为RCR校验码
    	RC522_ClearBitMask(Status2Reg,0x08);
    	status=RC522_PcdComMF522(PCD_TRANSCEIVE,buffer,9,buffer,&recvBits);
    	
    	if((status==MI_OK)&&(recvBits==0x18))    
    		size=buffer[0];     
    	else    
    		size=0;
    	
    	return size; 
    }
    
    
    /*
    延时函数,纳秒级
    */
    void RC522_Delay(u32 ns)
    {
      u32 i;
      for(i=0;i<ns;i++)
      {
        __nop();
        __nop();
        __nop();
      }
    }
    
    
    /*
    函数功能:RC522芯片初始化
    */
    void RC522_Init(void)
    {
      RC522_IO_Init();	//RC522初始化
      RC522_PcdReset();  			//复位RC522 
      RC522_PcdAntennaOff();	//关闭天线
      DelayMs(2);  		  //延时2毫秒
      RC522_PcdAntennaOn();		//开启天线
      M500PcdConfigISOType('A'); //设置RC632的工作方式
    }
    
    
    /*
    函数功能:复位RC522
    */
    void RC522_Reset(void)
    {
      RC522_PcdReset();				//复位RC522
      RC522_PcdAntennaOff();	//关闭天线
      DelayMs(2);  		  //延时2毫秒
      RC522_PcdAntennaOn();		//开启天线  	
    }     
    
    
    /*
    功    能: 寻卡
    参数说明: req_code[IN]:寻卡方式
                    0x52   = 寻感应区内所有符合14443A标准的卡
                    0x26   = 寻未进入休眠状态的卡
              			pTagType[OUT]:卡片类型代码
                    0x4400 = Mifare_UltraLight
                    0x0400 = Mifare_One(S50)
                    0x0200 = Mifare_One(S70)
                    0x0800 = Mifare_Pro(X)
                    0x4403 = Mifare_DESFire
    返 回 值: 成功返回MI_OK
    */
    char RC522_PcdRequest(u8 req_code,u8 *pTagType)
    {
    	char status;  
    	u8 unLen;
    	u8 ucComMF522Buf[MAXRLEN];  	   // MAXRLEN  18
    
    	RC522_ClearBitMask(Status2Reg,0x08);	//清RC522寄存器位,/接收数据命令
    	RC522_WriteRawRC(BitFramingReg,0x07); //写RC632寄存器
    	RC522_SetBitMask(TxControlReg,0x03);  //置RC522寄存器位
     
    	ucComMF522Buf[0]=req_code; 	    //寻卡方式
    	
    	status=RC522_PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen); //通过RC522和ISO14443卡通讯
    	
    	if((status==MI_OK)&&(unLen==0x10))
    	{    
    		*pTagType=ucComMF522Buf[0];
    		*(pTagType+1)=ucComMF522Buf[1];
    	}
    	else
    	{
    	  status = MI_ERR;
    	}  
    	return status;
    }
    
    
    /*
    功    能: 防冲撞
    参数说明: pSnr[OUT]:卡片序列号,4字节
    返    回: 成功返回MI_OK
    */
    char RC522_PcdAnticoll(u8 *pSnr)
    {
        char status;
        u8 i,snr_check=0;
        u8 unLen;
        u8 ucComMF522Buf[MAXRLEN]; 
        
        RC522_ClearBitMask(Status2Reg,0x08);  //清RC522寄存器位 
        RC522_WriteRawRC(BitFramingReg,0x00); //写
        RC522_ClearBitMask(CollReg,0x80);     //清
     
        ucComMF522Buf[0]=PICC_ANTICOLL1;   //PICC_ANTICOLL1 = 0x93
        ucComMF522Buf[1]=0x20;
    	
        status=RC522_PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen); //0x0c,通过RC522和ISO14443卡通讯
    											 //PCD_TRANSCEIVE =发送并接收数据
    											 //2:写入卡里的数据字节长度
    											 //ucComMF522Buf:存放数据的地址
    											 //unLen:从卡里读出的数据长度
        if(status==MI_OK)
        {
        	 for(i=0;i<4;i++)
    			 {   
    					 *(pSnr+i)=ucComMF522Buf[i];  //把读到的卡号赋值给pSnr
    					 snr_check^=ucComMF522Buf[i];
    			 }
    			 if(snr_check!=ucComMF522Buf[i])
    			 {
    					status = MI_ERR;
    			 }
        }   
        RC522_SetBitMask(CollReg,0x80);
        return status;
    }
    
    
    /*
    功    能:选定卡片
    参数说明:pSnr[IN]:卡片序列号,4字节
    返    回:成功返回MI_OK
    */
    char RC522_PcdSelect(u8 *pSnr)
    {
        char status;
        u8 i;
        u8 unLen;
        u8 ucComMF522Buf[MAXRLEN]; 
        
        ucComMF522Buf[0]=PICC_ANTICOLL1;
        ucComMF522Buf[1]=0x70;
        ucComMF522Buf[6]=0;
    	
        for(i=0;i<4;i++)
        {
        	ucComMF522Buf[i+2]=*(pSnr+i);
        	ucComMF522Buf[6]^=*(pSnr+i);
        }
    		
        RC522_CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]); //用MF522计算CRC16函数,校验数据
        RC522_ClearBitMask(Status2Reg,0x08);	                //清RC522寄存器位
        status=RC522_PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);
        if((status==MI_OK)&&(unLen==0x18))status=MI_OK;
        else status=MI_ERR;
    		
        return status;
    }
    
    
    /*
    功    能:验证卡片密码
    参数说明:auth_mode[IN]: 密码验证模式
                     0x60 = 验证A密钥
                     0x61 = 验证B密钥 
              addr[IN]:块地址
              pKey[IN]:扇区密码
              pSnr[IN]:卡片序列号,4字节
    返    回:成功返回MI_OK
    */               
    char RC522_PcdAuthState(u8 auth_mode,u8 addr,u8 *pKey,u8 *pSnr)
    {
        char status;
        u8 unLen;
        u8 ucComMF522Buf[MAXRLEN];  //MAXRLEN  18(数组的大小)
    	  
    	  //验证模式+块地址+扇区密码+卡序列号   
        ucComMF522Buf[0]=auth_mode;		
        ucComMF522Buf[1]=addr;				
        memcpy(&ucComMF522Buf[2],pKey,6); //拷贝,复制
        memcpy(&ucComMF522Buf[8],pSnr,4); 
    	 
        status=RC522_PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
        if((status!= MI_OK)||(!(RC522_ReadRawRC(Status2Reg)&0x08)))status = MI_ERR;
        return status;
    }
    
    
    /*
    功    能:读取M1卡一块数据
    参数说明: 
    					addr:块地址
              p   :读出的块数据,16字节
    返    回:成功返回MI_OK
    */ 
    char RC522_PcdRead(u8 addr,u8 *p)
    {
        char status;
        u8 unLen;
        u8 i,ucComMF522Buf[MAXRLEN]; //18
    
        ucComMF522Buf[0]=PICC_READ;
        ucComMF522Buf[1]=addr;
        RC522_CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
        status=RC522_PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);//通过RC522和ISO14443卡通讯
        if((status==MI_OK&&(unLen==0x90)))
        {
            for(i=0;i<16;i++)
    				{
    						*(p +i)=ucComMF522Buf[i];
    				}
        }
        else
        {   
    			status=MI_ERR;
    		}
        return status;
    }
    
    
    /*
    功    能:写数据到M1卡指定块
    参数说明:addr:块地址
              p   :向块写入的数据,16字节
    返    回:成功返回MI_OK
    */                  
    char RC522_PcdWrite(u8 addr,u8 *p)
    {
        char status;
        u8 unLen;
        u8 i,ucComMF522Buf[MAXRLEN]; 
        
        ucComMF522Buf[0]=PICC_WRITE;// 0xA0 //写块
        ucComMF522Buf[1]=addr;      //块地址
        RC522_CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
     
        status=RC522_PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
    
        if((status!= MI_OK)||(unLen != 4)||((ucComMF522Buf[0]&0x0F)!=0x0A))
        {
    				status = MI_ERR;
    		}
    		
        if(status==MI_OK)
        {
            for(i=0;i<16;i++)//向FIFO写16Byte数据 
            {    
            	ucComMF522Buf[i]=*(p +i);   
            }
            RC522_CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);
            status = RC522_PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
            if((status != MI_OK)||(unLen != 4)||((ucComMF522Buf[0]&0x0F)!=0x0A))
            {   
    					status = MI_ERR;   
    				}
        }
        return status;
    }
    
    
    /*
    功    能:命令卡片进入休眠状态
    返    回:成功返回MI_OK
    */
    char RC522_PcdHalt(void)
    {
        u8 status;
        u8 unLen;
        u8 ucComMF522Buf[MAXRLEN]; //MAXRLEN==18
    	  status=status;
        ucComMF522Buf[0]=PICC_HALT;
        ucComMF522Buf[1]=0;
        RC522_CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
        status=RC522_PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
        return MI_OK;
    }
    
    
    /*
    功    能:用MF522计算CRC16函数
    参    数:
    				*pIn :要读数CRC的数据
    				len:-数据长度
    				*pOut:计算的CRC结果
    */
    void RC522_CalulateCRC(u8 *pIn ,u8 len,u8 *pOut )
    {
        u8 i,n;
        RC522_ClearBitMask(DivIrqReg,0x04);  //CRCIrq = 0  
        RC522_WriteRawRC(CommandReg,PCD_IDLE);
        RC522_SetBitMask(FIFOLevelReg,0x80); //清FIFO指针
        
    	  //向FIFO中写入数据  
    		for(i=0;i<len;i++)
        {  
    			RC522_WriteRawRC(FIFODataReg,*(pIn +i));  //开始RCR计算
    		}
    		
    		RC522_WriteRawRC(CommandReg,PCD_CALCCRC);   //等待CRC计算完成 
    		i=0xFF;
        do 
        {
            n=RC522_ReadRawRC(DivIrqReg);
            i--;
        }
        while((i!=0)&&!(n&0x04));//CRCIrq = 1
    	  
    		//读取CRC计算结果 
    		pOut[0]=RC522_ReadRawRC(CRCResultRegL);
        pOut[1]=RC522_ReadRawRC(CRCResultRegM);
    }
    
    
    /*
    功    能:复位RC522
    返    回:成功返回MI_OK
    */
    char RC522_PcdReset(void)
    {
    	  RC522_RST=1;   //PF1写1
        RC522_Delay(10);
    	  RC522_RST=0;   //PF1清0
        RC522_Delay(10);
    	  RC522_RST=1;	 //PF1写1
        RC522_Delay(10);
        RC522_WriteRawRC(CommandReg,PCD_RESETPHASE);  //写RC632寄存器,复位
    	  RC522_WriteRawRC(CommandReg,PCD_RESETPHASE);	//写RC632寄存器,复位
        RC522_Delay(10);
        
        RC522_WriteRawRC(ModeReg,0x3D);             //和Mifare卡通讯,CRC初始值0x6363
        RC522_WriteRawRC(TReloadRegL,30);           //写RC632寄存器   
        RC522_WriteRawRC(TReloadRegH,0);
        RC522_WriteRawRC(TModeReg,0x8D);
        RC522_WriteRawRC(TPrescalerReg,0x3E);
    	
    	  RC522_WriteRawRC(TxAutoReg,0x40);//必须要
        return MI_OK;
    }
    
    
    /*
    函数功能:设置RC632的工作方式 
    */
    char M500PcdConfigISOType(u8 type)
    {
       if(type=='A')                        //ISO14443_A
       { 
    		 RC522_ClearBitMask(Status2Reg,0x08);     //清RC522寄存器位
    		 RC522_WriteRawRC(ModeReg,0x3D);          //3F//CRC初始值0x6363
    		 RC522_WriteRawRC(RxSelReg,0x86);         //84
    		 RC522_WriteRawRC(RFCfgReg,0x7F);         //4F  //调整卡的感应距离//RxGain = 48dB调节卡感应距离  
    		 RC522_WriteRawRC(TReloadRegL,30);        //tmoLength);// TReloadVal = 'h6a =tmoLength(dec) 
    	   RC522_WriteRawRC(TReloadRegH,0);
    		 RC522_WriteRawRC(TModeReg,0x8D);
    	   RC522_WriteRawRC(TPrescalerReg,0x3E);
    	   RC522_Delay(1000);
         RC522_PcdAntennaOn();		//开启天线 
       }
       else return 1;       //失败,返回1
       return MI_OK;				//成功返回0
    }
    
    
    /*
    功    能:读RC632寄存器
    参数说明:Address[IN]:寄存器地址
    返    回:读出的值
    */
    u8 RC522_ReadRawRC(u8 Address)
    {
        u8 ucAddr;
        u8 ucResult=0;		
    		RC522_CS=0;						//片选选中RC522
        ucAddr=((Address<<1)&0x7E)|0x80;
    		RC522_SPI_ReadWriteOneByte(ucAddr);		  //发送命令
    		ucResult=RC522_SPI_ReadWriteOneByte(0); //读取RC522返回的数据
    		RC522_CS=1;						   //释放片选线(PF0)
    		return ucResult;         //返回读到的数据
    }
    
    
    /*
    功    能:写RC632寄存器
    参数说明:Address[IN]:寄存器地址
              value[IN] :写入的值
    */
    void RC522_WriteRawRC(u8 Address,u8 value)
    {  
      u8 ucAddr;
    	RC522_CS=0; //PF0写 0 (SDA)(SPI1片选线,低电平有效)
      ucAddr=((Address<<1)&0x7E); 
    	RC522_SPI_ReadWriteOneByte(ucAddr); //SPI1发送一个字节
    	RC522_SPI_ReadWriteOneByte(value);  //SPI1发送一个字节
    	RC522_CS=1;										      //PF1写1(SDA)(SPI1片选线)
    }
    
    
    /*
    功    能:置RC522寄存器位
    参数说明:reg[IN]:寄存器地址
              mask[IN]:置位值
    */
    void RC522_SetBitMask(u8 reg,u8 mask)  
    {
        char tmp=0x0;
        tmp=RC522_ReadRawRC(reg);					//读RC632寄存器
        RC522_WriteRawRC(reg,tmp|mask);   //写RC632寄存器
    }
    
    
    /*
    功    能:清RC522寄存器位
    参数说明:reg[IN]:寄存器地址
             mask[IN]:清位值
    */
    void RC522_ClearBitMask(u8 reg,u8 mask)  
    {
        char tmp=0x0;
        tmp=RC522_ReadRawRC(reg);        //读RC632寄存器
        RC522_WriteRawRC(reg,tmp&~mask); // clear bit mask
    } 
    
    
    /*
    功    能:通过RC522和ISO14443卡通讯
    参数说明:Command[IN]:RC522命令字
              pIn [IN]:通过RC522发送到卡片的数据
              InLenByte[IN]:发送数据的字节长度
              pOut [OUT]:接收到的卡片返回数据
              *pOutLenBit[OUT]:返回数据的位长度
    */
    char RC522_PcdComMF522(u8 Command,u8 *pIn,u8 InLenByte,u8 *pOut,u8 *pOutLenBit)
    {
        char status=MI_ERR;
        u8 irqEn=0x00;
        u8 waitFor=0x00;
        u8 lastBits;
        u8 n;
        u16 i;
    	
        switch(Command)
        {
    			case PCD_AUTHENT:    //验证密钥
    					 irqEn=0x12;
    					 waitFor=0x10;
    					 break;
    			case PCD_TRANSCEIVE: //发送并接收数据
    					 irqEn=0x77;
    					 waitFor=0x30;
    					 break;
    			default:
    					 break;
        }
        RC522_WriteRawRC(ComIEnReg,irqEn|0x80);	
        RC522_ClearBitMask(ComIrqReg,0x80);			//清所有中断位
        RC522_WriteRawRC(CommandReg,PCD_IDLE);	
        RC522_SetBitMask(FIFOLevelReg,0x80);	 	//清FIFO缓存
        
        for(i=0;i<InLenByte;i++)
        {   
    				RC522_WriteRawRC(FIFODataReg,pIn[i]);
    		}
    		
    		RC522_WriteRawRC(CommandReg,Command);	 
    		if(Command==PCD_TRANSCEIVE)
    		{  
    			RC522_SetBitMask(BitFramingReg,0x80);	 //开始传送
    		}
        
    		//有问题,下面的循环
        //i = 600;//根据时钟频率调整,操作M1卡最大等待时间25ms
    		  i=2000;
    			do 
    			{
    				n=RC522_ReadRawRC(ComIrqReg);
    				i--;
    			}
    			while((i!=0)&&!(n&0x01)&&!(n&waitFor));
    				
    			RC522_ClearBitMask(BitFramingReg,0x80);
    			if(i!=0)
    			{    
            if(!(RC522_ReadRawRC(ErrorReg)&0x1B))
            {
                status=MI_OK;
                if(n&irqEn&0x01)
                {
    							status=MI_NOTAGERR;
    						}
                if(Command==PCD_TRANSCEIVE)
                {
                   	n=RC522_ReadRawRC(FIFOLevelReg);
                  	lastBits=RC522_ReadRawRC(ControlReg)&0x07;
                    if(lastBits)
                    {
    									*pOutLenBit=(n-1)*8+lastBits;
    								}
                    else
                    {   
    									*pOutLenBit=n*8;   
    								}
    								
                    if(n==0)n=1;
                    if(n>MAXRLEN)n=MAXRLEN;
                    for(i=0; i<n; i++)
                    {   
    									pOut[i]=RC522_ReadRawRC(FIFODataReg);    
    								}
                }
            }
            else
            {   
    					status=MI_ERR;   
    				}
        }
        RC522_SetBitMask(ControlReg,0x80);// stop timer now
        RC522_WriteRawRC(CommandReg,PCD_IDLE); 
        return status;
    }
    
    
    /*
    函数功能:开启天线  
    参    数:每次启动或关闭天险发射之间应至少有1ms的间隔
    */
    void RC522_PcdAntennaOn(void)
    {
        u8 i;
        i=RC522_ReadRawRC(TxControlReg);
        if(!(i&0x03))
        {
            RC522_SetBitMask(TxControlReg,0x03);
        }
    }
    
    
    /*
    函数功能:关闭天线  
    参    数:每次启动或关闭天险发射之间应至少有1ms的间隔
    */
    void RC522_PcdAntennaOff(void)
    {
    	RC522_ClearBitMask(TxControlReg,0x03); //清RC522寄存器位
    }
    
    

    5.2 rc522.h

    #ifndef RFID_RC522_H
    #define RFID_RC522_H
    #include "sys.h"
    
    /*
    RC522射频模块外部的接口:    
    *1--SDA <----->PF0--片选脚
    *2--SCK <----->PA5--时钟线
    *3--MOSI<----->PA7--输出
    *4--MISO<----->PA6--输入
    *5--悬空
    *6--GND <----->GND
    *7--RST <----->PF1--复位脚
    *8--VCC <----->VCC
    */
    #define RC522_OUTPUT PAout(7)
    #define RC522_INPUT PAin(6)
    #define RC522_SCLK PAout(5)
    #define RC522_CS PFout(0)
    #define RC522_RST PFout(1)
    
    
    //MF522命令字
    #define PCD_IDLE              0x00               //取消当前命令
    #define PCD_AUTHENT           0x0E               //验证密钥
    #define PCD_RECEIVE           0x08               //接收数据
    #define PCD_TRANSMIT          0x04               //发送数据
    #define PCD_TRANSCEIVE        0x0C               //发送并接收数据
    #define PCD_RESETPHASE        0x0F               //复位
    #define PCD_CALCCRC           0x03               //CRC计算
    
    
    //Mifare_One卡片命令字
    #define PICC_REQIDL           0x26               //寻天线区内未进入休眠状态,返回的是卡的类型
    #define PICC_REQALL           0x52               //寻天线区内全部卡,返回的是卡的类型
    #define PICC_ANTICOLL1        0x93               //防冲撞
    #define PICC_ANTICOLL2        0x95               //防冲撞
    #define PICC_AUTHENT1A        0x60               //验证A密钥
    #define PICC_AUTHENT1B        0x61               //验证B密钥   命令认证代码
    #define PICC_READ             0x30               //读块
    #define PICC_WRITE            0xA0               //写块
    #define PICC_DECREMENT        0xC0               //扣款
    #define PICC_INCREMENT        0xC1               //充值
    #define PICC_RESTORE          0xC2               //调块数据到缓冲区
    #define PICC_TRANSFER         0xB0               //保存缓冲区中数据
    #define PICC_HALT             0x50               //休眠
    
    //MF522 FIFO长度定义
    #define DEF_FIFO_LENGTH       64                 //FIFO size=64byte
    #define MAXRLEN  18
    
    
    //MF522寄存器定义
    // PAGE 0
    #define     RFU00                 0x00    
    #define     CommandReg            0x01    
    #define     ComIEnReg             0x02    
    #define     DivlEnReg             0x03    
    #define     ComIrqReg             0x04    
    #define     DivIrqReg             0x05
    #define     ErrorReg              0x06    
    #define     Status1Reg            0x07    
    #define     Status2Reg            0x08    
    #define     FIFODataReg           0x09
    #define     FIFOLevelReg          0x0A
    #define     WaterLevelReg         0x0B
    #define     ControlReg            0x0C
    #define     BitFramingReg         0x0D
    #define     CollReg               0x0E
    #define     RFU0F                 0x0F
    // PAGE 1     
    #define     RFU10                 0x10
    #define     ModeReg               0x11
    #define     TxModeReg             0x12
    #define     RxModeReg             0x13
    #define     TxControlReg          0x14
    #define     TxAutoReg             0x15
    #define     TxSelReg              0x16
    #define     RxSelReg              0x17
    #define     RxThresholdReg        0x18
    #define     DemodReg              0x19
    #define     RFU1A                 0x1A
    #define     RFU1B                 0x1B
    #define     MifareReg             0x1C
    #define     RFU1D                 0x1D
    #define     RFU1E                 0x1E
    #define     SerialSpeedReg        0x1F
    // PAGE 2    
    #define     RFU20                 0x20  
    #define     CRCResultRegM         0x21
    #define     CRCResultRegL         0x22
    #define     RFU23                 0x23
    #define     ModWidthReg           0x24
    #define     RFU25                 0x25
    #define     RFCfgReg              0x26
    #define     GsNReg                0x27
    #define     CWGsCfgReg            0x28
    #define     ModGsCfgReg           0x29
    #define     TModeReg              0x2A
    #define     TPrescalerReg         0x2B
    #define     TReloadRegH           0x2C
    #define     TReloadRegL           0x2D
    #define     TCounterValueRegH     0x2E
    #define     TCounterValueRegL     0x2F
    
    // PAGE 3      
    #define     RFU30                 0x30
    #define     TestSel1Reg           0x31
    #define     TestSel2Reg           0x32
    #define     TestPinEnReg          0x33
    #define     TestPinValueReg       0x34
    #define     TestBusReg            0x35
    #define     AutoTestReg           0x36
    #define     VersionReg            0x37
    #define     AnalogTestReg         0x38
    #define     TestDAC1Reg           0x39  
    #define     TestDAC2Reg           0x3A   
    #define     TestADCReg            0x3B   
    #define     RFU3C                 0x3C   
    #define     RFU3D                 0x3D   
    #define     RFU3E                 0x3E   
    #define     RFU3F		  		        0x3F
    
    
    //和MF522通讯时返回的错误代码
    #define 	MI_OK                 0
    #define 	MI_NOTAGERR           1
    #define 	MI_ERR                2
    
    #define	SHAQU1		0X01
    #define	KUAI4			0X04
    #define	KUAI7			0X07
    #define	REGCARD		0xa1
    #define	CONSUME		0xa2
    #define READCARD	0xa3
    #define ADDMONEY	0xa4
    
    /*
        RC522各种驱动函数
    */
    u8 RC522_SPI_ReadWriteOneByte(u8 tx_data);
    void RC522_IO_Init(void);
    u8 RC522_MFRC522_SelectTag(u8 *serNum);
    void RC522_Delay(u32 ns);
    void RC522_Init(void);
    void RC522_Reset(void);
    char RC522_PcdRequest(u8 req_code,u8 *pTagType);
    char RC522_PcdAnticoll(u8 *pSnr);
    char RC522_PcdSelect(u8 *pSnr);
    char RC522_PcdAuthState(u8 auth_mode,u8 addr,u8 *pKey,u8 *pSnr);
    char RC522_PcdRead(u8 addr,u8 *p);
    char RC522_PcdWrite(u8 addr,u8 *p);
    char RC522_PcdHalt(void);
    void RC522_CalulateCRC(u8 *pIn ,u8 len,u8 *pOut );
    char RC522_PcdReset(void);
    char M500PcdConfigISOType(u8 type);
    char M500PcdConfigISOType(u8 type);
    u8 RC522_ReadRawRC(u8 Address);
    void RC522_WriteRawRC(u8 Address,u8 value);
    void RC522_SetBitMask(u8 reg,u8 mask) ;
    void RC522_ClearBitMask(u8 reg,u8 mask);
    char RC522_PcdComMF522(u8 Command,u8 *pIn,u8 InLenByte,u8 *pOut,u8 *pOutLenBit);
    void RC522_PcdAntennaOn(void);
    void RC522_PcdAntennaOff(void);
    #endif
    
    

     

    展开全文
  • HarmonyOS应用开发-应用偏好数据读写

    千次阅读 2020-09-25 14:35:15
    感谢关注HarmonyOS,为了便于大家学习特将鸿蒙2.0基础教学内容整理如下: 1、HarmonyOS应用开发—视频播放 ...2、HarmonyOS应用开发—基本控件 ...3、HarmonyOS应用开发—UI开

    感谢关注HarmonyOS,为了便于大家学习特将鸿蒙2.0基础教学内容整理如下:

    1、HarmonyOS应用开发—视频播放
    https://developer.huawei.com/consumer/cn/codelab/HarmonyOS-hap1/index.html#0

    2、HarmonyOS应用开发—基本控件
    https://developer.huawei.com/consumer/cn/codelab/HarmonyOS-hap2/index.html#0

    3、HarmonyOS应用开发—UI开发与预览
    https://developer.huawei.com/consumer/cn/codelab/HarmonyOS-ui/index.html#0

    4、HarmonyOS应用开发—设备虚拟化特性开发
    https://developer.huawei.com/consumer/cn/codelab/HarmonyOS-screenhardware/index.html#0

    5、HarmonyOS应用开发—HelloWorld应用开发E2E体验
    https://developer.huawei.com/consumer/cn/codelab/HarmonyOS-HelloWorld/index.html#0

    6、HarmonyOS应用开发—有界面元程序交互
    https://developer.huawei.com/consumer/cn/codelab/HarmonyOS-hap6/index.html#0

    7、HarmonyOS应用开发-分布式任务调度
    https://developer.huawei.com/consumer/cn/codelab/HarmonyOS-hap5/index.html#0

    8、HarmonyOS应用开发—剪切板
    https://developer.huawei.com/consumer/cn/codelab/HarmonyOS-hap4/index.html#0

    9、HarmonyOS应用开发—应用偏好数据读写
    https://developer.huawei.com/consumer/cn/codelab/HarmonyOS-hap3/index.html#0

    以下为HarmonyOS应用开发—应用偏好数据读写节选部分,如想进一步了解,请点击:HarmonyOS应用开发—应用偏好数据读写

    一、介绍

    1.本篇CodeLab将实现的内容

    HarmonyOS是面向全场景多终端的分布式操作系统,使得应用程序的开发打破了智能终端互通的性能和数据壁垒,业务逻辑原子化开发,适配多端。通过一个简单应用开发,体验HarmonyOS的轻量级偏好数据库能力。

    2.您将建立什么

    在这个CodeLab中,你将创建Demo Project,并将Demo编译成HAP,此示例应用程序展示了如何使用轻量级偏好数据库。

    3.您将会学到什么

    • 如何创建一个HarmonyOS Demo Project
    • 如何构建一个HAP并且将其部署到智慧屏真机
    • 通过此示例应用体验如何使用轻量级偏好数据库

    二、您需要什么

    1. 硬件要求

    • 操作系统:Windows10 64位
    • 内存:8G及以上
    • 硬盘:100G及以上
    • 分辨率:1280*800及以上

    2. 软件要求

    • 安装DevEcoStudio和Node.js,详情请参考下载和安装软件
    • 设置DevEco Studio开发环境,DevEco Studio开发环境需要依赖于网络环境,需要连接上网络才能确保工具的正常使用,可以根据如下两种情况来配置开发环境
      1.如果可以直接访问Internet,只需进行下载HarmonyOS SDK操作
      2.如果网络不能直接访问Internet,需要通过代理服务器才可以访问,请参考配置开发环境

    3. 需要的知识点

    • Java基础开发能力。

    三、能力接入准备

    实现HarmonyOS应用开发,需要完成以下准备工作:

    具体操作,请按照《DevEco Studio使用指南》中详细说明来完成。

    四、代码编写

    Preferences初始化:

    private void initPreferences() {
        DatabaseHelper databaseHelper = new DatabaseHelper(this);
        String fileName = "user_info";
        mPreferences = databaseHelper.getPreferences(fileName);
    }
    

    Preferences使用:

    int random = (int) (100 * Math.random());
    mPreferences.putInt("age", random);
    mPreferences.putString("name", "张三" + random);
    mPreferences.flushSync();
    mInfo.setText("写入成功");
    
    int age = mPreferences.getInt("age", 0);
    String name = mPreferences.getString("name", "");
    mInfo.setText("age is " + age + ", name is " + name);
    

    提示:以上代码仅demo演示参考使用,产品化的代码需要使用国际化。

    五、编译运行

    通过hdc连接大屏设备

    先查看智慧屏IP:大屏设置->“网络与连接”->“网络”->“无线网络”
    在cmd或者IDE的Terminal输入命令:

    hdc tconn 192.168.xxx.xxx:5555
    

    运行

    在这里插入图片描述

    六、恭喜您

    您已经成功完成了HarmonyOS应用开发体验,学到了:

    • 如何创建一个HarmonyOS Demo Project
    • 如何构建一个HAP并且将其部署到智慧屏真机
    • 通过此示例应用体验如何使用轻量级偏好数据库

    【如果您想学习HarmonyOS 应用开发基础教程 请猛戳】

    展开全文
  • 1.前言 VTK应用程序所需的数据可以通过两种途径获取: 第一种是生成模型 ;第二种是从外部存储介质里导入相关...一般以数据的读取 (或由模型创建数据)开始,而以数据的写盘操作(或 Mapper)结束。 前面我们已经接触到了

    1.前言

    VTK应用程序所需的数据可以通过两种途径获取: 第一种是生成模型 ;第二种是从外部存储介质里导入相关的数据文件,(如vtkBMPReader读取 BMP图像) 。VTK 也可以将程序中处理完成的数据写入单个文件中, 或者将所渲染的场景导出。从可视化管线的角度来看,一般以数据的读取 (或由模型创建数据)开始,而以数据的写盘操作(或 Mapper)结束

    前面我们已经接触到了 VTK的 Reader类,将数据导入可视化管道的流程:

    • 实例化 Reader对象;
    • 指定所要读取的文件名;
    • 调用 Update()方法促使管线执行。当管线后续的 Fiter有 Update0请求时,如调用Render()方法管线就会读取相应的图像文件, 所以这一步可省略 。

    类似地, 使用 Writer类的主要步骤如下:

    • 实例化 Writer对象;
    • 输入要写盘的数据以及指定待写盘的文件名;
    • 调用 Write()方法促使 Writer类开始写盘操作。

    2.vtkImageData类

    图像数据在 VTK 中是用vtkImageData类表示的,对于不同的图像文件类型, VTK提供相对应的类对图像文件进行读写操作。比如,前面章节中所提的vtkBMPReader是用于读取 BMP图像, vtkJPEGReader用于读取 JPG图像。 VTK除了支持 BMP、 JPG图像格式之外,还支持其他多种图像格式的读写。例如:

    注意:
    1.值得注意的是vtkImageReader/vtkImageWriter用于读写RAW格式的数据(即俗称的“裸数据”) ,该类型的图像没有文件信息,因此在读取此类图像时,需要指定图像各个维度的大小、字节顺序(是大端字节序还是小端字节序)、存储像素値的类型等信息,只有指定这些信息、,类vtkImageReader才能正确读取图像
    2.类vtkDicomImageReader可用于读取DICOM图像,但该类的功能很不完善,虽然VTK 最初是因医学图像可视化而诞生。但VTK对DICOM图像的读写操作却很不支持,比如该类不支持多帧DICOM图像的读取,而且VTK 也没有实现对 DICOM图像的写操作, 即没有提供类vlkDlCOMlmageWriter。
    对 DICOM图像支持较好的函数库主要有 GDCM和 DCMTK。著名的医学图像分割与配准工具包 ITK 就是封装了 GDCM函数库进行 DICOM图像的读写。

    3.单幅图像的读写

    #include <vtkAutoInit.h>    
    VTK_MODULE_INIT(vtkRenderingOpenGL);  
    
    #include <vtkSmartPointer.h>
    #include <vtkPNGReader.h>
    #include <vtkImageViewer2.h>
    #include <vtkRenderWindowInteractor.h>
    #include <vtkJPEGWriter.h>
    #include <vtkRenderer.h> //定义了Camera
    
    int main()
    {
    	//读取PNG图像
    	vtkSmartPointer<vtkPNGReader> pngread = 
    		vtkSmartPointer<vtkPNGReader>::New();
    	pngread->SetFileName("logo.png");
    	//显示该幅图像
    	vtkSmartPointer<vtkImageViewer2> ImageViewer =
    		vtkSmartPointer<vtkImageViewer2>::New();
    	ImageViewer->SetInputConnection(pngread->GetOutputPort());
    
    	vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInter = 
    		vtkSmartPointer<vtkRenderWindowInteractor>::New();
    	ImageViewer->SetupInteractor(renderWindowInter);
    	ImageViewer->Render();
    	ImageViewer->GetRenderer()->ResetCamera();
    	ImageViewer->Render();
    
    	//写图像
    	vtkSmartPointer<vtkJPEGWriter> writer = 
    		vtkSmartPointer<vtkJPEGWriter>::New();
    	writer->SetFileName("VTK-logo.jpg");
    	writer->SetInputConnection(pngread->GetOutputPort());
    	writer->Write();
    
    	renderWindowInter->Start();
    }
           
    该段代码先使用vtkPNGReader读入 PNG图像,然后用VTK 窗口显示读取的 PNG图像,最后使用类vtkJPEGWriter将读入的文件写成JPG图像。程序中使用 SetFileName方法设置要读写的图像名, 在写文件操作时要调用方法 Write方法才会将内存中的数据写入到存储介质中。 

    可能我们会感觉到很奇怪,数据管线已经铺设好了,可是我们是怎么样实现引擎渲染的呢?已到最后完成了与Windows操作系统完成了交互?在显示图像时并没有用到,vtkRenderWindow、 vtkRenderer、 vtkActor等类,而只是使用了vtkImageViewer2以及设置了交互样式。其实, VTK 可视化管线相关的几个类都已经封装在vtkImageViewer2 里。vtkImageViewer2主要是针对二维图像(特别是医学图像)显示设计的,实现了图像缩放、转、平移、窗宽窗位调节等功能: 除了可以用于单幅二维图像的显示之外, 也可以显示三维图像的某个切片, 还可以设置不同的显示方向。

    4.读取序列图像文件

    医学图像应用程序中常常会处理序列的图像文件,比如计算机断层成像或者磁共振成像所成图像一般都是由多个有顺序的二维图像组成, 应用程序需要一次性导入一个序列的二维图像。VTK没有提供专门的类读取序列图像文件,但是VTK的图像Reader类都有提供方法SetFileNames()来设置多个图像文件名,利用该方法可以实现序列图像的读取。
    #include <vtkAutoInit.h>    
    VTK_MODULE_INIT(vtkRenderingOpenGL);  
    
    #include <stdio.h>
    #include <vtkSmartPointer.h>
    #include <vtkStringArray.h>
    #include <vtkJPEGReader.h>
    #include <vtkImageViewer2.h>
    #include <vtkRenderWindowInteractor.h>
    #include <vtkRenderer.h>
    
    int main()
    {
    	//生成文件序列组名
    	vtkSmartPointer <vtkStringArray> fileArray =
    		vtkSmartPointer <vtkStringArray>::New();
    	char fileName[128];
    	for(int i=1; i<100; i++)
    	{
    		sprintf(fileName,"Head/head%03d.jpg",i);
    		vtkstd::string fileStr(fileName);
    		fileArray->InsertNextValue(fileStr);
    	}
    	//读取JPG序列图像
    	vtkSmartPointer <vtkJPEGReader> reader = 
    		vtkSmartPointer <vtkJPEGReader>::New();
    	reader->SetFileNames(fileArray);
    
    	//显示
    	vtkSmartPointer<vtkImageViewer2> viewer = 
    		vtkSmartPointer<vtkImageViewer2>::New();
    	viewer->SetInputConnection(reader->GetOutputPort());
    	vtkSmartPointer<vtkRenderWindowInteractor> interact =
    		vtkSmartPointer<vtkRenderWindowInteractor>::New();
    	//默认选择第50张切片
    	viewer->SetSlice(50);
    	//viewer->SetSliceOrientationToXY();
    	viewer->SetSliceOrientationToXZ();
    	//viewer->SetSliceOrientationToYZ();
    	viewer->SetupInteractor(interact);
    	viewer->Render();
    
    	interact->Start();
    	return 0;
    }
    程序中使用 vtkStringArray生成文件名列表, 然后调用 vtkJPEGReader的方法。SetFileNames()设置符读取的序列图像的文件名 。初始显示该序列图像的第50个切片,显示的方向为 SetSliceOrientationToXY()。
    还可以使用 Reader类里的 SetFilePrefix()和 SetFilePattem()等方法读取序列图像。


    5.参考资料

    1.《C++ primer》
    2.《The VTK User’s Guide – 11thEdition》
    3.《The Visualization Toolkit – AnObject-Oriented Approach To 3D Graphics (4th Edition)》
    4.  张晓东, 罗火灵. VTK图形图像开发进阶[M]. 机械工业出版社, 2015.



    展开全文
  • ESP8266 SDK开发之数据读写

    千次阅读 2016-12-20 23:02:08
    ESP8266 SDK开发之数据读写

    程序开发难免涉及到数据读写,最近搞ESP8266模块的网络配置和连接部分,涉及到模块重启需要恢复部分数据的问题,网上查了部分资料,结合官网的的案例代码段将相关经验给大家简单总结分享一下。

    数据的读写会用到bool system_param_load (uint16 start_sec,uint16 offset,void *param,uint16 len)及bool system_param_save_with_protect (uint16 start_sec,void *param,uint16 len)两个函数,具体函数说明可查看API,官方SDK开发包里面的IoT_Demo例子user_esp_platform.c里面用到了这两个方法,这里只简单介绍这两个方法如何使用。比如我现在需要保存的数据是一个服务器IP地址(server_ip)及服务器的端口(server_port)数据,首先先定义一个类型server_info,定义如下:

    struct server_info {char server_ip[4];int server_port;} ser_info;

    根据文档说明,还需要一个地址,这个地址文档里面也明确说明了使用0x3D,那我们就来定义一个地址

    #define ESP_PARAM_START_SEC 0x3D

    现在来试试保存我们的服务器地址和端口数据,假设IP地址是char ser_ip[4]={192,168,11,11},端口为9999

    os_memcpy(ser_info.server_ip, ser_ip, os_strlen(ser_ip));
    ser_info.server_port = 9999;
    system_param_save_with_protect(ESP_PARAM_START_SEC, &ser_info, sizeof(ser_info));


    那么如何把数据读取出来呢?可以使用下面的代码:

    system_param_load(ESP_PARAM_START_SEC, 0, &ser_info, sizeof(ser_info));
    os_memcpy(ser_ip, ser_info.esp_tcp_server_ip, os_strlen(ser_info.esp_tcp_server_ip));
    server_port = ser_info.server_port;

    好了,就是这么简单,希望对大家有帮助。


    欢迎有兴趣的朋友加QQ群:254267969,共同交流学习~~~~











    展开全文
  • java使用IO对象流进行数据读写

    千次阅读 2017-12-17 21:56:20
    对象的读写  使用ObjectInputStream和ObjectOutputStream读写对象(序列化与反序列化)。 只有字节流没有字符流 1).类必须实现Serializable接口 2).给类加个序列化编号,给类定义一个标记,新的修改后的类还...
  • 用c#开发的一个串口通信程序,实现用c#操作串口进行数据读写,相当实用
  • python操作txt文件中数据教程[1]-使用python读写txt文件

    千次阅读 多人点赞 2018-11-26 17:57:20
    python操作txt文件中数据教程[1]-使用python读写txt文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 原始txt文件 程序实现后结果 程序实现 filename = './test/test.txt' contents = [] DNA_sequence = [] #...
  • Verilog数据读写操作

    千次阅读 2020-06-24 15:33:25
    Verilog的数据读入Verilog数据读入存储器装入数据文件读写 Verilog数据读入 数据读入方式有寄存器阵列形式的一次装入,也有类似C语言的文件读写操作 存储器装入数据 $readmemh("file_name.mem",mem); //16进制数据...
  • 今天,我们继续学习SpringBoot集成JPA如何实现数据读写分离。废话不多话直接上代码。 一、配置数据源 # 数据源 spring.datasource.druid.write.url=jdbc:mysql://localhost:3380/test spring.datasource.druid.wr...
  • springboot 怎么保证数据读写一致性

    千次阅读 2019-08-27 18:21:45
    springboot 怎么保证数据读写一致性,springboot 怎么保证数据读写一致性,springboot 怎么保证数据读写一致性,springboot 怎么保证数据读写一致性 , 除了tranctional注解,还有什么方式吗 ...
  • QDataStream 二进制数据读写

    万次阅读 2017-03-20 14:24:43
    Qt中的QDataStream类为我们的程序提供了读写二进制数据的能力。一个数据流如果是二进制编码的数据流,那么它肯定是与计算机的操作系统、CPU或者字节序无关的。例如,一个数据流是在一个运行Windows系统的PC机上被...
  • 关于dicom参数信息和数据读写的理解

    万次阅读 2015-07-23 11:12:52
    1. 数据位存储(DCM_BitsStored)、数据位分配(DCM_BitsAllocated)、数据符号类型(DCM_PixelRepresentation)、灰度偏移(DCM_RescaleIntercept) 和数据值(DCM_PixelData)本身的关系:  (1) DCM_BitsAllocated是给每...
  • Arduino 串口数据读写

    万次阅读 2018-07-18 12:42:13
    使用read()函数时,每次只能读取1字节的数据,如果要读取一个字符串,可以使用“+=”运算符将字符依次添加到字符串中,此处参考《Arduino程序设计基础》中的示例: 完  2018/06/21  
  • 数据读写的乒乓操作

    千次阅读 2018-04-16 09:56:34
    数据读写的乒乓操作 文中一部分从其他博客中学习到,加入了自己实际应用的过程。 在重要数据的解帧与处理过程中,为了确保数据的实时性与可靠性,我们一般对收到的数据存储到芯片的RAM或Flash(掉电数据恢复)中...
  • 税务UKey分析及税务UKey数据读写

    千次阅读 多人点赞 2020-10-25 13:35:12
    下面以读取纳税人信息为例来分析税务UKey数据的读写,关于更多数据读写指令,如果有兴趣的话可以联系作者(QQ: 707534032)。 2.3.1 发送指令读取企业信息 从税务UKey中读取企业信息数据,需要向税务UKey发送指令...
  • python矩阵数据读写

    千次阅读 2018-12-07 13:54:20
    工具 numpy工具包 import numpy as np; 读矩阵 matrix = np.loadtxt(open("matrix.csv","rb"),delimiter=",",skiprows=0) ...读写保持一致,保证读写不改变数据...
  • 现在用.NET Core + EFCore +SqlServer实现数据读写分离 介绍 为什么要读写分离? 降低数据库服务器的压力 如何实现读写分离? 1.一个主库多个从库 2.配置主库复制数据到从库 为什么一个主库多个从库...
  • XML语言数据读写理解1

    千次阅读 2019-10-27 13:33:38
    可扩展标记语言(XML)是一种非常简单的数据存储读写语言,与其他数据库语言相比,这是它最大的优点。 废话少说,接下来我们就写一下XML的语言格式:如何从0开始写一个XML数据文件,并用C++语言将里面的数据读出来...
  • 【Cocos creator】文件数据读写,用户数据存储

    万次阅读 多人点赞 2016-12-01 00:10:22
    【首先吐槽一下:对于Cocos creator,一方面自己对相关知识不太熟悉,但是另一方面cocos creator 的api文档也太不完善了,想实现对Json文件进行数据读写的功能花了我一天时间。还好,最终在cocos中文网引擎开发人员...
  • 图解数据读写与Cache操作

    万次阅读 多人点赞 2016-07-27 15:21:24
    高速缓存(Cache)主要是为了解决CPU运算速度与内存(Memory)读写速度不匹配的矛盾而存在, 是CPU与内存之间的临时存贮器,容量小,但是交换速度比内存快。 本文仅针对Cache的读写进行简单说明并通过示意图演示什么...
  • 百万级数据读写Excle

    千次阅读 2017-03-02 22:27:01
    Excel 2003及以下的版本。一张表最大支持65536行数据,256列。...目前读写Excle常用JAVA技术分为POI、JXL、FASTEXCLE。相比其它两种技术,POI支持公式、宏以及格式设置,效率高。  对于大数据量的写入,POI在最
  • Hdfs读写数据流程

    千次阅读 2017-04-29 19:20:46
    一:Hdfs读数据流程 1、跟namenode通信查询元数据,找到文件块所在的datanode服务器 2、挑选一台datanode(就近原则,然后随机)服务器,请求建立socket流 3、datanode开始发送数据(从磁盘里面读取数据放入流,以...
  • 我当时一想,这个问题并不是很难,于是就直接采用了这样的方法:拿着一个表中的数据作为索引,去挨个遍历相关表中的数据,最后经过算分的过程,直接在算分函数中将算出的分数直接写入数据库,这就导致了标题说的问题...
  • HDFS读写数据的原理

    千次阅读 2017-12-26 22:04:08
    下面说下HDFS读写数据的原理。1 概述 HDFS集群分为两大角色:NameNode、DataNode NameNode负责管理整个文件系统的元数据 DataNode 负责管理用户的文件数据块 文件会按照固定的大小(blocksize)切成若干块后...
  • 求大神能给具体一点的思路,能给一个解决方案,并没有什么思路?

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,036,909
精华内容 414,763
关键字:

数据读写