RFID节点的编写

新项目开始咯,其实就是华清项目的换皮,增强了对传感器的控制加了大量的32采集与控制节点,由于时间紧迫先按照节点发布文章。以后有时间会发一些框架和整体数据流向分析的文章。

一、RFID节点框架

我的想法是使用超高频RFID技术,在门口布置一个大型的RFID读写器,采集出入货物电子标签的信息,这个电子标签也可以只有ID,但这样就要在这个节点加一个数据库,32这么小的内存就不太够了,需要换成A9.因为我只会这两个型号的单片机所以哈哈。

在ZET6上使用串口连接一个cc2530.使用SPI来和RC522通信.超高频的RFID读写器太贵了好几千真的没钱了。所以使用RC522代替一下。主要这个范围太小只能拿ID卡来模拟咯。

蜂鸣器是为了整个系统报警用的。可以换成继电器控制那种特别响的大功率报警器。OLED用来显示信息。但是它太小了也就能显示个ID。所以我换了我以前买的一块触摸屏。100块(太痛了)。

二、具体的程序

首先需要使用来把字库传到我们的串行Flash

使用的是UNIGBK.bin字库烧入到SD卡然后写个SD卡驱动,当然不是我写的。直接就是调用哈哈。

/********************************************************************************* 文件名程: main.c * 作    者: 硬石嵌入式开发团队* 版    本: V1.0* 编写日期: 2015-10-04* 功    能: 中文字库烧写******************************************************************************* 说明:* 本例程配套硬石stm32开发板YS-F1Pro使用。* * 淘宝:* 论坛:http://www.ing10bbs.com* 版权归硬石嵌入式开发团队所有,请勿商用。*******************************************************************************/  //使用之前:
//1.保证已经把字库文件拷贝到SD卡内并插入到开发板上,
//五个文件:stxinhei16.xbf,kaiti24.xbf,UNIGBK.BIN,GBK_HZ1616.FON和GBK_HZ2424.FON
//2.使用该工程写字库文件需要一定时间请耐心等候保存字库写入成功
//3.使用该工程建议使用串口调试助手工具查看字库写入进度。/* 包含头文件 ----------------------------------------------------------------*/
#include "stm32f10x.h"
#include "bsp/led/bsp_led.h"
#include "bsp/key/bsp_key.h"
#include "bsp/beep/bsp_beep.h"
#include "bsp/usart/bsp_debug_usart.h"
#include "bsp/spi_flash/bsp_spi_flash.h"
#include "ff.h"/* 私有类型定义 --------------------------------------------------------------*/
/* 私有宏定义 ----------------------------------------------------------------*/
#define GBK_HZ1616                  (1)   //1:使能烧写GBK_HZ1616.FON字库文件(裸机中文显示专用);0:不烧写
#define GBK_HZ2424                  (1)   //1:使能烧写GBK_HZ2424.FON字库文件(裸机中文显示专用);0:不烧写
#define FATFS_UNIGBK                (1)   //1:使能烧写UNIGBK.BIN字库文件(FatFS文件系统专用);0:不烧写
#define XBF_STXIHEI16               (1)   //1:使能烧写stxihei16.xbf字库文件(STemWin专用);0:不烧写
#define XBF_KAITI24                 (1)   //1:使能烧写kaiti24.xbf字库文件(STemWin专用);0:不烧写#define GBK_HZ1616_ADDR       (10*4096)   // GBK_HZ1616.FON字库文件存放在串行Flash的地址
#define GBK_HZ2424_ADDR       (75*4096)   // GBK_HZ2424.FON字库文件存放在串行Flash的地址
#define FATFS_UNIGBK_ADDR    (332*4096)   // UNIGBK.BIN字库文件存放在串行Flash的地址
#define XBF_STXIHEI16_ADDR   (380*4096)   // stxihei16.xbf字库文件存放在串行Flash的地址
#define XBF_KAITI24_ADDR     (750*4096)   // kaiti24.xbf字库文件存放在串行Flash的地址#define GBK_HZ1616_SIZE            (64)   // GBK_HZ1616.FON字库文件占用扇区数(每个扇区为4096个字节)
#define GBK_HZ2424_SIZE           (144)   // GBK_HZ2424.FON字库文件占用扇区数(每个扇区为4096个字节)
#define FATFS_UNIGBK_SIZE          (43)   // UNIGBK.BIN字库文件存放占用扇区数(每个扇区为4096个字节)
#define XBF_STXIHEI16_SIZE        (348)   // stxihei16.xbf字库文件存占用扇区数(每个扇区为4096个字节)
#define XBF_KAITI24_SIZE          (628)   // kaiti24.xbf字库文件存占用扇区数(每个扇区为4096个字节)/* 获取缓冲区的长度 */
/* 私有变量 ------------------------------------------------------------------*/
FATFS fs;													/* FatFs文件系统对象 */
FIL file;													/* 文件对象 */
FRESULT f_res;                    /* 文件操作结果 */
UINT fnum;            					  /* 文件成功读写数量 *//* 扩展变量 ------------------------------------------------------------------*/
/* 私有函数原形 --------------------------------------------------------------*/
static void printf_fatfs_error(FRESULT fresult);
/* 函数体 --------------------------------------------------------------------*//*** 函数功能: 主函数.* 输入参数: 无* 返 回 值: 无* 说    明: 无*/
int main(void)
{   uint32_t write_addr=0,j=0;uint8_t tempbuf[256]={0};/* 初始化LED灯 */LED_GPIO_Init();/* 初始化独立按键 */ KEY_GPIO_Init();/* 初始化蜂鸣器 */BEEP_GPIO_Init();/* 调试串口初始化配置,115200-N-8-1.使能串口发送和接受 */DEBUG_USART_Init();    printf("****** 这是一个烧写中文字库到串行Flash空间内实验 ******\n");printf("》》按下开发板KEY1按键开始烧写\n");while(KEY1_StateRead()==KEY_UP);//等待按键被按下/* 初始化串行Flash */SPI_FLASH_Init();//挂载文件系统f_res = f_mount(&fs,"0:",1);  printf_fatfs_error(f_res);//如果文件系统挂载失败就停机if(f_res != FR_OK){while(1);}/**************************  GBK_HZ1616.FON字库文件  *****************************************/		
#if GBK_HZ1616f_res = f_open(&file,"0:GBK_HZ1616.FON",FA_OPEN_EXISTING | FA_READ);printf("f_open GBK_HZ1616.FON res=%d\n",f_res);if(f_res==FR_OK){// 擦除空间write_addr=GBK_HZ1616_ADDR;for(j=0;j<GBK_HZ1616_SIZE;j++)//擦除扇区{SPI_FLASH_SectorErase(write_addr+j*4096);}// 烧写字库文件j=0;write_addr=GBK_HZ1616_ADDR;while(f_res == FR_OK) {f_res = f_read( &file, tempbuf, 256, &fnum);//读取数据	 if(f_res!=FR_OK)break;			 //执行错误  SPI_FLASH_PageWrite(tempbuf,write_addr,256);  //拷贝数据到串行flash上    write_addr+=256;				j++;if(fnum !=256)break;} }f_close(&file);BEEP_ON;SPI_FLASH_BufferRead(tempbuf,GBK_HZ1616_ADDR,256);			//读取数据,打印验证printf("readbuf GBK_HZ1616.FON:\n");for(j=0;j<256;j++)printf("%02X ",tempbuf[j]);printf("\n如果tempbuf不全为 FF ,那么说明字库拷贝成功!!!\n");if((tempbuf[0]!=0xff)&&(tempbuf[1]!=0xff))LED1_ON;BEEP_OFF;
#endif  //#if GBK_HZ1616
/**************************  END GBK_HZ1616.FON字库文件  *****************************************/  /**************************  GBK_HZ2424.FON字库文件  *****************************************/		
#if GBK_HZ2424f_res = f_open(&file,"0:GBK_HZ2424.FON",FA_OPEN_EXISTING | FA_READ);printf("f_open GBK_HZ2424.FON res=%d\n",f_res);if(f_res==FR_OK){// 擦除空间write_addr=GBK_HZ2424_ADDR;for(j=0;j<GBK_HZ2424_SIZE;j++)//擦除扇区{SPI_FLASH_SectorErase(write_addr+j*4096);}// 烧写字库文件j=0;write_addr=GBK_HZ2424_ADDR;while(f_res == FR_OK) {f_res = f_read( &file, tempbuf, 256, &fnum);//读取数据	 if(f_res!=FR_OK)break;			 //执行错误  SPI_FLASH_PageWrite(tempbuf,write_addr,256);  //拷贝数据到串行flash上    write_addr+=256;				j++;if(fnum !=256)break;} }f_close(&file);BEEP_ON;SPI_FLASH_BufferRead(tempbuf,GBK_HZ2424_ADDR,256);			//读取数据,打印验证printf("readbuf GBK_HZ2424.FON:\n");for(j=0;j<256;j++)printf("%02X ",tempbuf[j]);printf("\n如果tempbuf不全为 FF ,那么说明字库拷贝成功!!!\n");if((tempbuf[0]!=0xff)&&(tempbuf[1]!=0xff))LED2_ON;BEEP_OFF;
#endif  //#if GBK_HZ2424
/**************************  END GBK_HZ2424.FON字库文件  *****************************************/  /**************************  UNIGBK.BIN字库文件  *****************************************/		
#if FATFS_UNIGBKf_res = f_open(&file,"0:UNIGBK.BIN",FA_OPEN_EXISTING | FA_READ);printf("f_open UNIGBK.BIN res=%d\n",f_res);if(f_res==FR_OK){// 擦除空间write_addr=FATFS_UNIGBK_ADDR;for(j=0;j<FATFS_UNIGBK_SIZE;j++)//擦除扇区{SPI_FLASH_SectorErase(write_addr+j*4096);}// 烧写字库文件j=0;write_addr=FATFS_UNIGBK_ADDR;while(f_res == FR_OK) {f_res = f_read( &file, tempbuf, 256, &fnum);//读取数据	 if(f_res!=FR_OK)break;			 //执行错误  SPI_FLASH_PageWrite(tempbuf,write_addr,256);  //拷贝数据到串行flash上    write_addr+=256;				j++;if(fnum !=256)break;} }f_close(&file);BEEP_ON;SPI_FLASH_BufferRead(tempbuf,FATFS_UNIGBK_ADDR,256);			//读取数据,打印验证printf("readbuf UNIGBK.BIN:\n");for(j=0;j<256;j++)printf("%02X ",tempbuf[j]);printf("\n如果tempbuf不全为 FF ,那么说明字库拷贝成功!!!\n");if((tempbuf[0]!=0xff)&&(tempbuf[1]!=0xff))LED3_ON;BEEP_OFF;
#endif  //#if FATFS_UNIGBK
/**************************  END UNIGBK.BIN字库文件  *****************************************/  /**************************  stxihei16.xbf字库文件  *****************************************/		
#if XBF_STXIHEI16f_res = f_open(&file,"0:stxihei16.xbf",FA_OPEN_EXISTING | FA_READ);printf("f_open stxinhei16.xbf res=%d\n",f_res);if(f_res==FR_OK){// 擦除空间write_addr=XBF_STXIHEI16_ADDR;for(j=0;j<XBF_STXIHEI16_SIZE;j++)//擦除扇区{SPI_FLASH_SectorErase(write_addr+j*4096);}// 烧写字库文件j=0;write_addr=XBF_STXIHEI16_ADDR;while(f_res == FR_OK) {f_res = f_read( &file, tempbuf, 256, &fnum);//读取数据	 if(f_res!=FR_OK)break;			 //执行错误  SPI_FLASH_PageWrite(tempbuf,write_addr,256);  //拷贝数据到串行flash上    write_addr+=256;				j++;if(fnum !=256)break;} }f_close(&file);BEEP_ON;SPI_FLASH_BufferRead(tempbuf,XBF_STXIHEI16_ADDR,256);			//读取数据,打印验证printf("readbuf stxihei16.xbf:\n");for(j=0;j<256;j++)printf("%02X ",tempbuf[j]);printf("\n如果tempbuf不全为 FF ,那么说明字库拷贝成功!!!\n");if((tempbuf[0]!=0xff)&&(tempbuf[1]!=0xff))LED1_OFF;BEEP_OFF;
#endif  //#if XBF_STXIHEI16
/**************************  END stxihei16.xbf字库文件  *****************************************/  /**************************  kaiti24.xbf字库文件  *****************************************/		
#if XBF_KAITI24f_res = f_open(&file,"0:kaiti24.xbf",FA_OPEN_EXISTING | FA_READ);printf("f_open kaiti24.xbf res=%d\n",f_res);if(f_res==FR_OK){// 擦除空间write_addr=XBF_KAITI24_ADDR;for(j=0;j<XBF_KAITI24_SIZE;j++)//擦除扇区{SPI_FLASH_SectorErase(write_addr+j*4096);}// 烧写字库文件j=0;write_addr=XBF_KAITI24_ADDR;while(f_res == FR_OK) {f_res = f_read( &file, tempbuf, 256, &fnum);//读取数据	 if(f_res!=FR_OK)break;			 //执行错误  SPI_FLASH_PageWrite(tempbuf,write_addr,256);  //拷贝数据到串行flash上    write_addr+=256;				j++;if(fnum !=256)break;} }f_close(&file);BEEP_ON;SPI_FLASH_BufferRead(tempbuf,XBF_KAITI24_ADDR,256);			//读取数据,打印验证printf("readbuf kaiti24.xbf:\n");for(j=0;j<256;j++)printf("%02X ",tempbuf[j]);printf("\n如果tempbuf不全为 FF ,那么说明字库拷贝成功!!!\n");if((tempbuf[0]!=0xff)&&(tempbuf[1]!=0xff))LED3_OFF;BEEP_OFF;
#endif  //#if XBF_KAITI24
/**************************  END kaiti24.xbf字库文件  *****************************************/  //不再使用文件系统,取消挂载文件系统f_res = f_mount(NULL,"0:",1);/* 无限循环 */while (1){    }
}/*** 函数功能: FatFS文件系统操作结果信息处理.* 输入参数: FatFS文件系统操作结果:FRESULT* 返 回 值: 无* 说    明: 无*/
static void printf_fatfs_error(FRESULT fresult)
{switch(fresult){case FR_OK:                   //(0)printf("》操作成功。\n");break;case FR_DISK_ERR:             //(1)printf("!!硬件输入输出驱动出错。\n");break;case FR_INT_ERR:              //(2)printf("!!断言错误。\n");break;case FR_NOT_READY:            //(3)printf("!!物理设备无法工作。\n");break;case FR_NO_FILE:              //(4)printf("!!无法找到文件。\n");break;case FR_NO_PATH:              //(5)printf("!!无法找到路径。\n");break;case FR_INVALID_NAME:         //(6)printf("!!无效的路径名。\n");break;case FR_DENIED:               //(7)case FR_EXIST:                //(8)printf("!!拒绝访问。\n");break;case FR_INVALID_OBJECT:       //(9)printf("!!无效的文件或路径。\n");break;case FR_WRITE_PROTECTED:      //(10)printf("!!逻辑设备写保护。\n");break;case FR_INVALID_DRIVE:        //(11)printf("!!无效的逻辑设备。\n");break;case FR_NOT_ENABLED:          //(12)printf("!!无效的工作区。\n");break;case FR_NO_FILESYSTEM:        //(13)printf("!!无效的文件系统。\n");break;case FR_MKFS_ABORTED:         //(14)printf("!!因函数参数问题导致f_mkfs函数操作失败。\n");break;case FR_TIMEOUT:              //(15)printf("!!操作超时。\n");break;case FR_LOCKED:               //(16)printf("!!文件被保护。\n");break;case FR_NOT_ENOUGH_CORE:      //(17)printf("!!长文件名支持获取堆空间失败。\n");break;case FR_TOO_MANY_OPEN_FILES:  //(18)printf("!!打开太多文件。\n");break;case FR_INVALID_PARAMETER:    // (19)printf("!!参数无效。\n");break;}
}
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/

这是硬石给的官方模板。写的真的太好了,我就直接拿来用了。烧入完编写我们的RFID程序。因为文件很多下面我只分享主文件。等项目完工我会整个上传到git仓库到时候评论区放链接。

 /* 包含头文件 ----------------------------------------------------------------*/
#include "stm32f10x.h"
#include "stdlib.h"
#include "bsp/usart/bsp_debug_usart.h"
#include "bsp/lcd/bsp_lcd.h"
#include "bsp/RC522/rc522_function.h"
#include "bsp/RC522/rc522_config.h"
#include "bsp/systick/bsp_SysTick.h"
#include "bsp/beep/bsp_beep.h"
//#include "bsp/usart/bsp_usart2.h"/* 私有类型定义 --------------------------------------------------------------*/
/* 私有宏定义 ----------------------------------------------------------------*/
/* 私有变量 ------------------------------------------------------------------*/
unsigned char RFID[16];	
unsigned char card_1[4]={176,42,57,82};
uint8_t KEY[6]={0xff,0xff,0xff,0xff,0xff,0xff};
uint8_t Rxflag=0;
uint8_t ucTemp;
uint8_t ucaRxBuf[256];
uint16_t usRxCount;/* 扩展变量 ------------------------------------------------------------------*/
/* 私有函数原形 --------------------------------------------------------------*/
void IC_test ( void );
int test(void);/* 函数体 --------------------------------------------------------------------*/
/*****************************   重要说明     *********************************  使用本例程之前,需要运行“YSF1-051. 烧写中文字库到串行Flash”例程******************************************************************************//*** 函数功能: 主函数.* 输入参数: 无* 返 回 值: 无* 说    明: 无*/
int main(void)
{   uint32_t lcdid;/* 初始化3.5寸TFT液晶模组,一般优先于调试串口初始化 */lcdid=BSP_LCD_Init();   /* 调试串口初始化配置,115200-N-8-1.使能串口发送和接受 */DEBUG_USART_Init();BEEP_GPIO_Init();SysTick_Init();  RC522_Init ();	/* 调用格式化输出函数打印输出数据 */printf("LCD ID=0x%08X\n",lcdid);  /* 开背光 */LCD_BK_ON();PcdReset();M500PcdConfigISOType ( 'A' );//设置工作方式while ( 1 ){printf("\nRFID start\n");Delay_ms(1000);IC_test ();//IC卡检测	//scanf("%s",ucaRxBuf);if(test() == 1){printf("%s\r\n",ucaRxBuf);LCD_DispString_EN(0,20,ucaRxBuf,BLACK, YELLOW,FONT_24);}printf("\nRFID stop\n");}
}/** * 接收串口的数据,分析并处理 * 可以将此段代码封装为一个函数,在主程序其它流程调用
*/
int test()
{if(Rxflag){if (usRxCount < sizeof(ucaRxBuf)){ucaRxBuf[usRxCount++] = ucTemp;}else{usRxCount = 0;}/* 遇到换行字符,认为接收到一个命令 */if (ucTemp == '+')	/* 换行字符 */{usRxCount = 0;return 1;}Rxflag=0;}return 0;
}/*** 函数功能: 门禁测试函数* 输入参数: 无* 返 回 值: 无* 说    明: 无*/
void IC_test ( void )
{char cStr [ 30 ];//unsigned char s=0x08;unsigned char ucArray_ID [ 4 ];  //先后存放IC卡的类型和UID(IC卡序列号)uint8_t ucStatusReturn;          //返回状态//uint8_t *len;//uint8_t *buf;//while ( 1 ){ /*寻卡*/if ( ( ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID ) ) != MI_OK )                                   /*若失败再次寻卡*/ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID );		   if ( ucStatusReturn == MI_OK  ){/*防冲撞(当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作)*/if ( PcdAnticoll ( ucArray_ID ) == MI_OK )  {sprintf ( cStr, "The Card ID is: %02X%02X%02X%02X", ucArray_ID [ 0 ], ucArray_ID [ 1 ], ucArray_ID [ 2 ], ucArray_ID [ 3 ] );							printf ( "%s\r\n",cStr ); LCD_DispString_EN(0,0,cStr,BLACK, YELLOW,FONT_24);//USART_printf(USART2," \r\n %s \r\n",cStr);/*选卡*/ucStatusReturn=PcdSelect(ucArray_ID) ;       }        }//scanf("%s",buf);//printf("%c",USART_ReceiveData(USARTx));//LCD_DispString_EN(0,20,get_rebuff(len),BLACK, YELLOW,FONT_24);}
}
/******************************************************************************/
/*                 STM32F10x Peripherals Interrupt Handlers                   */
/*  Add here the Interrupt Handler for the used peripheral(s) (PPP), for the  */
/*  available peripheral interrupt handler's name please refer to the startup */
/*  file (startup_stm32f10x_xx.s).                                            */
/******************************************************************************/
void USART1_IRQHANDLER(void)
{printf("/n11111/n");if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){ 	Rxflag=1;		ucTemp = USART_ReceiveData(USART1);} }/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/

目前还只能读RFID通过zigbee发送,无法处理zigbee接收到的信息神奇。

应该是程序没写好等我后面一起发 

三、GPIO分配表

cc2530:
    PA2/USART2_TXD                              串口2发送
    PA3/USART2_RXD                              串口2接收
RC522:
    PB12/TIM1_BKIN                              CS
    PB13/TIM1_CH1N                              SCK
    PB14/TIM1_CH2N                              MOSI
    PB15/TIM1_CH3N                              MISO
    PC0/ADC123_IN10/OV_D0                       restart
TFT:
    省略,这块不懂原理我就直接用了
    PE2/TP_NIRQ                                 电阻触摸屏中断
    PE3/TP_SCK                                  电阻触摸屏时钟线
    PE4/TP_MOSI                                 电阻触摸屏数据线
    PE5/TP_MISO                                 电阻触摸屏数据线
    PE6/TP_CS                                   电阻触摸屏片选
  经典A9,A10串口一

蜂鸣器:
    PD7/BEEP                                    蜂鸣器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/255374.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

(七)DSP28335基础教程——I2C通信实验(OLED显示控制)

0 前言 本期实验目标&#xff1a;采用硬件I2C模块与OLED进行通信&#xff0c;完成显示控制。 目前发现28335比较缺乏关于I2C模块的实用例程&#xff0c;许多新手在配置使用该模块比较难上手&#xff0c;走弯路。那么通过该例程&#xff0c;大家则可以快速学会使用I2C的基本功…

安卓开发淘宝抢购界面!史上最全的Android面试题集锦,附带学习经验

前言 这是“拔剑金九银十”的第二篇文章&#xff0c;本文主要针对3年以上的Android开发者进阶面试中高级开发工程师而整理。 希望可以对你们有所帮助。不多废话&#xff0c;进入正题。 目录&#xff1a; Java中高级 计算机网络 Android高级面试—性能优化 Android优秀第三方…

Linux系统下imx6ull QT编程—— Ubuntu 下编写程序(一)

Linux QT编程 文章目录 Linux QT编程前言一、C简介二、C环境设置1.安装编译 C 语言和 C的环境。2.创建文件编写代码3.编译运行代码 总结 前言 绍在 Ubuntu 在终端窗口下使用 vi/vim 编辑一个 C源文件。通过编写最简单的示例“Hello,World QCX”。 一、C简介 C &#xff08;c…

0531最后的挣扎结束于传说中的段错误

部署训练后的缺陷检测模型 Linux Ubuntu18.04双机尝试 报错&#xff0c;Linux内核或是编译器版本不匹配&#xff0c;多次尝试更改18.04的gcc&#xff0c;g&#xff0c;gcc-arm-linux&#xff0c;garm-linux的代码&#xff0c;尝试在Makefile文件里更改编译器路径、添加LInux内…

用Python求最大公约数和最小公倍数(51)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 和猫妹学Python&#xff0c;一起趣味学编程。 今日主题 什么是最大公约数&#xff1f; 如何用Python求最大公约数&#xff1f; 什么是最小公倍数&#xff1f; 如何用Pyt…

PDF免费压缩、在线压缩

找了很多个网站&#xff0c;发现说是免费&#xff0c;其实不然。 在线上传&#xff0c;在线压缩&#xff0c;然后直接下载&#xff0c;没有任何套路。 PDF Compressor – Compress PDF Files OnlineThis online PDF compressor allows compressing PDF files without degradi…

PDF文件怎么压缩大小

PDF文件怎么压缩大小&#xff1f;3个办法实现一键压缩 相信大家在工作中&#xff0c;会收到许多的PDF文件&#xff0c;但随着时间的推移&#xff0c;PDF文件便会越积越多&#xff0c;最终导致我们的电脑内存严重不足&#xff0c;这时候只好把一些PDF文件删除&#xff0c;来释放…

【C#图解教程】第四章 类型、存储和变量 学习笔记总结

类型 C#是一组类型声明&#xff0c;这个与第三章&#xff1a;命名空间就是一组类型声明可以一起理解。类型是一个用来创建数据结构的模板&#xff1a; 使用这个模板创建对象的过程叫做实例化&#xff0c;所以创建的对象也叫实例 类型成员 简单类型可能只包含一个数据成员&…

chatgpt赋能python:Python中的%怎么用

Python中的%怎么用 Python中的%是一个非常重要的运算符&#xff0c;也称为格式化运算符。它用于将一个值插入到另一个字符串中。在本文中&#xff0c;我们将深入了解Python中的%运算符的使用。 %运算符的语法 先看下%运算符的语法&#xff1a; string % values其中&#xf…

Mongo帮助文档

来自&#xff1a;http://xiaoshan5634.iteye.com/blog/1117702 Mongo 适合场景&#xff1a; 网站数据&#xff1a;适合实时的插入&#xff0c;更新与查询&#xff0c;并具备网站实时数据存储所需的复制 及高度伸缩性。 缓存&#xff1a;适合作为信息基础设施的缓存层。在系…

Erlang/OTP设计原则(文档翻译)

http://erlang.org/doc/design_principles/des_princ.html 图和代码皆源自以上链接中Erlang官方文档&#xff0c;翻译时的版本为20.1。 这个设计原则&#xff0c;其实是说用户在设计系统的时候应遵循的标准和规范。阅读前我一直以为写的是作者在设计 Erlang/OTP 框架时的一些原…

Spring Cloud Alibaba 参考文档-2021.0.4.0

Spring Cloud Alibaba 简介依赖管理Spring Cloud Alibaba Nacos Discovery3.1 服务注册/发现&#xff1a;Nacos Discovery3.2 如何引入Nacos Discovery进行服务注册/发现3.3 使用Nacos Discovery进行服务注册/发现和调用的示例3.3.1 Nacos 服务器启动3.3.2. 启动供应商申请3.3.…

autojs 开发文档集合

加入我们的QQ群553908361,和各作者同群交流 教程会优先发布于收费脚本v群。 该代码选自于aj开发者的文档,群里有人反馈开发文档打开慢.所以做了这个.方便搜索.如有侵权,请私信我进行删除 同时也上传了一份源码到点击网站,供大家更快的查询代码 Auto.js Pro-8.1.0 文档 索引 | …

云网络安全与数据中心安全

近年来&#xff0c;许多云架构师宣称随着公共云的采用&#xff0c;网络安全性将消亡。然而&#xff0c;网络安全仍然是最大的安全市场之一&#xff0c;并且是每个主要云服务提供商 (CSP) 在过去几年中推出重要新产品的领域。 网络对安全仍然至关重要&#xff0c;即使在云中也是…

Python中的导入模块

1&#xff0c;导入模块的的几种方式 模块是什么&#xff1f; 模块实际上就是 以.py为结尾的文件 注意点&#xff1a;自定义的模块尽量不要和系统模块重名 模块内部封装了很多实用的功能&#xff0c;有时在模块外部调用就需要将其导入&#xff0c;导入模块简单划分&#xff…

python导入模块错误-No module named XXX-图文解决方案

问题描述&#xff1a; 使用python ide执行脚本正常&#xff0c;使用python直接执行报错&#xff0c;报错“不存在对应模块” 问题原因分析&#xff1a; Q1: 等同于python脚本在ide和console中执行的区别 Q2: 因为在ide里执行脚本的时候&#xff0c;不仅会导入path环境变量中的…

python中导入模块使用哪个关键字_关于python导入模块的关键字介绍

关于python导入模块的关键字介绍 发布时间&#xff1a;2020-04-17 10:13:26 来源&#xff1a;亿速云 阅读&#xff1a;101 作者&#xff1a;小新 今天小编给大家分享的是关于python导入模块的关键字介绍&#xff0c;很多人都不太了解&#xff0c;今天小编为了让大家更加了解pyt…

【Python问题】Python 导入模块的三种方式ModuleNotFoundError: No module named ‘模块名‘

Python 导入模块的三种方式ModuleNotFoundError: No module named 模块名 问题一、Python解释器查找模块文件的过程。二、解决方法记录一下 大家可以参考这个文档的解释很清楚&#xff1a;python导入模块的三种方式超详细http://c.biancheng.net/view/4645.html 问题 写程序i…

python怎么导入数学模块_python怎么导入模块

python中的模块即.py文件,模块的导入方式通常有两种:1是直接使用import语句导入;2是使用from..import..结构引入。 使用 import 导入模块的语法,但实际上 import 还有更多详细的用法,主要有以下两种:import 模块名1 [as 别名1], 模块名2 [as 别名2],…: 导入整个模块。…

python如何导入模块中的类_python导入模块中类的方法

自定义标题 python导入模块中类的方法 1、导入模块中的单类 2、一个模块中存储多个类时导入的方法 3、导入模块中所有类的方法 4、导入模块中的类时把类使用as取一个别名 python导入模块中类的方法 1、导入模块中的单类 》创建模块 #file:person.py class Person(): def __init…