linux 用户态调用驱动中的函数返回-1

/*****************驱动代码***************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#include "pciedrv.h"

#define GLOBAL_MAJOR 133

PCIE_DRV_CONTEXT pcieContext;
S32 x4orx1;

#define WRITE_DMA_AND_SEND 0x100
#define READ_FROM_BUFFER 0x200

#define BUSY 0x10
#define IDLE 0x11
#define EXIT 0x12
#define GLOBALMEM_MAJOR 133
#define TRANSMIT _IOC (_IOC_READ,IOCTL_MAGIC, 3, 4 )
#define RECEIVE _IOC (_IOC_WRITE,IOCTL_MAGIC,4, 4 )
ssize_t DriverRead (struct file* stFileName, const char __user* input, size_t size, loff_t* offset);
ssize_t DriverWrite (struct file* stFileName, const char __user* input, size_t size, loff_t* offset);

struct file_operations globalmem_fops =
{
.owner = THIS_MODULE,
.read = DriverRead,
.write = DriverWrite,
};
static globalmem_major = GLOBALMEM_MAJOR;
struct globalmem_dev
{
struct cdev cdev;
unsigned char mem[0x10000];
};
struct globalmem_dev dev;

ssize_t DriverRead (struct file* stFileName, const char user* input, size_t size, loff_t* offset)
{
printk("%s\n",
FUNCTION__);
return 0;
}
ssize_t DriverWrite(struct file* stFileName, const char user* input, size_t size, loff_t* offset)
{
printk("%s\n",
FUNCTION__);
return 0;
}

static int __init_func(void)
{
int retValue = 0;
dev_t devno = MKDEV(globalmem_major, 0);
if(globalmem_major)
{
retValue = register_chrdev_region(devno, 1, "pciedrv");
printk(KERN_ALERT "register charactor device region\n");
}
else
{
retValue = alloc_chrdev_region(devno, 0, 1, "pciedrv");
globalmem_major = MAJOR(devno);
printk(KERN_ALERT "alloc charactor device region\n");
}
if(retValue <0)
{
printk("Failed to register or alloc major\n");
}
devno = MKDEV(globalmem_major, 0);
cdev_init(&dev.cdev, &globalmem_fops);
dev.cdev.owner = THIS_MODULE;
dev.cdev.ops = &globalmem_fops;
retValue = cdev_add(&dev.cdev,devno,1);
if(retValue)
printk("cdev_add return %d\n",retValue);
retValue = PCIeDrvInit(PCIE0_BASEADDR, x4orx1);
if(retValue == 0)
printk(KERN_ALERT "PCIeDrvInit Success!\n ");
else
printk(KERN_ALERT "PCIeDrvInit Failed!\n");
control_buffer.status = 0;
control_buffer.command = 0;

printk(":D\n");
return retValue;
}
static void exit_func(void)
{
printk(KERN_ALERT "Here is entering the exit-point of the PCIE driver!!! \n");
cdev_del(&dev.cdev);
unregister_chrdev_region(MKDEV(globalmem_major, 0), 1);
PCIeDrvDeinit();
}
module_init(
init_func);
module_exit(__exit_func);
MODULE_AUTHOR("ZCTT");
MODULE_DESCRIPTION("Driver of PCIEx4");
MODULE_ALIAS("ICC Driver");
MODULE_LICENSE("GPL");
EXPORT_SYMBOL(__init_func);
EXPORT_SYMBOL(__exit_func);
/**************************调用函数代码***********************************/
#include
#include
#include
#include
#include
#include
#include
#define DEVICE_FILENAME "/bin/pciedrv.ko"
#define DEVICE_TYPE (0xA4<<24)
#define DEVICE_SERIAL (0x33<<16)
#define DEVICE_DERICTION IOC_NON
#define READ_PHY_ADDRESS 0x100
#define WRITE_PHY_ADDRESS 0x101
#define GLOBAL_MAJOR 133
#define IOCTL_MAGIC 't'

typedef struct {
unsigned long size;
unsigned int offset;
unsigned char buff [128];
}__attribute__((packed)) ioctl_read_info_t;
typedef struct {
unsigned long size;
unsigned int offset;
unsigned char buff [128];
}__attribute__((packed)) ioctl_write_info_t;
ioctl_read_info_t ioctl_read_info ;
ioctl_write_info_t ioctl_write_info ;
int main()
{
char* str = "Hello Guys This is the Message!\n";
int retValue ;
int dev = 0;
memset (ioctl_write_info.buff, 0, 128);
ioctl_write_info.size = strlen(str)+1;
ioctl_write_info.offset = 0;
memcpy (ioctl_write_info.buff, str, ioctl_write_info.size);
/**********************************************************/
dev = open(DEVICE_FILENAME, O_RDWR);
printf("dev = %d\n",dev);
printf(":--\n");
while(1)
{
int retValue = read(dev, str, strlen(str));
printf ("retValue = %d\n",retValue);
sleep(2);
write(dev, str, strlen(str));
printf ("retValue = %d\n",retValue);
}
printf("Finished system calling! \n");

/运行结果/
驱动部分的dmesg,事实上只打印出了init部分的内容
register charactor device region

:D
root@OpenWrt:~# a.out
dev = 3
:--
retValue = -1
retValue = -1
retValue = -1
retValue = -1
retValue = -1
retValue = -1
retValue = -1
^C
运行完a.out之后 demesg发现没有任何新增内容。

1个回答

你把read write换个函数名试试吧。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于Linux驱动probe函数以及detect函数不被调用的问题
我在写一个驱动,在init里面向i2c总线注册了一个结构体,结构体中包含了probe和detect以及remove系列函数,最后能打印成功注册的信息,但是probe和detect函数中printk("===%s===",—FUNCTION—)打印信息却没有打印,这几个函数里面只有一句打印,其余的还没有写上去,这是不是probe和detect都没有被调用啊,问题出在哪?
x86 linux 驱动调用i2c_transfer问题
内核版本是3.10.17 在内核配置上选上intel 82801 (ICH/PCH) 才能有/dev/i2c-0设备出来,相当于编译了文件drivers\i2c\busses\i2c-i801.c 但是跟踪到drivers\i2c\busses\i2c-i801.c没看到有封装i2c_transfer函数。 注册一个i2c驱动,调用i2c_transfer不成功。只能用i2c_smbus系列函数。有什么办法可以解决,因为我增加的驱动是调用i2c_transfer函数
[声卡驱动]关于ALSA设备的打开过程
例如一个playback设备,ALSA-lib提供了snd_pcm_open()来打开它。 我想问的是snd_pcm_open()是封装了linux 的open()函数吗,从而调用到ALSA-drv的snd_pcm_playback_open()函数? snd_pcm_open()里没有看到它是怎么实现调用到驱动中的打开函数的。。。
linux字符设备驱动求助:设备号无法释放
我在驱动中,资源释放时调用了unregister_chrdev_region函数,为什么用rmmod卸载驱动模块之后,/proc/devices里边仍能够显示我的驱动设备啊? lsmod中已经没有我写的驱动模块了。 是因为设备号没能正确释放么?
linux内核源码,函数体为什么只有一句return 0?
最近在用SI学习驱动程序,把linux内核源码拿出来,看着看着就有很多内联函数,函数体里面就只有一句return 0或者return一个错误码,其他什么都没有,这样的函数有什么意义啊?而且调用他们的语句还是在一个内核的函数里面,那既然都是不变的return 0,那就直接知道返回值是0了,还要调用它干嘛?这些函数不止一两个,是堆堆,这是有什么妙用吗?
linux驱动模块加载不成功调试过程
版本:linux2.6.30 问题出现的过程: 1,我在Ubuntu环境下编译驱动模块 2,编译成功后,在板子上insmod出现了 embest_led: version magic '2.6.30 mod_unload modversions ARMv5 ' should be '2.6.30 preempt mod_unload ARMv5 ' insmod: error inserting 'embest_led.ko': -1 Invalid module format 3,我就更改了/usr/src/linux-2.6.30/include/vermagic.h文件,最终结果是用modinfo查看embest_led.ko信息是‘2.6.30 preempt mod_unload ARMv’同时在板子上insmod后没出现上述错误,而且用lsmod可以查看到embest信息,改动如下: 1 #include <linux/utsrelease.h> 2 #include <linux/module.h> 3 4 #define DEBUG 5 6 #ifdef DEBUG 7 #define CONFIG_PREEMPT 8 #define CONFIG_MODULE_UNLOAD 9 #endif 10 /* Simply sanity version stamp for modules. */ 11 #ifdef CONFIG_SMP 12 #define MODULE_VERMAGIC_SMP "SMP " 13 #else 14 #define MODULE_VERMAGIC_SMP "" 15 #endif 16 #ifdef CONFIG_PREEMPT 17 #define MODULE_VERMAGIC_PREEMPT "preempt " 18 #else 19 #define MODULE_VERMAGIC_PREEMPT "" 20 #endif 21 #ifdef CONFIG_MODULE_UNLOAD 22 #define MODULE_VERMAGIC_MODULE_UNLOAD "mod_unload " 23 #else 24 #define MODULE_VERMAGIC_MODULE_UNLOAD "" 25 #endif 26 27 #ifdef DEBUG 28 29 #ifdef CONFIG_MODVERSIONS 30 #define MODULE_VERMAGIC_MODVERSIONS "" 31 #else 32 #define MODULE_VERMAGIC_MODVERSIONS "modversions " 33 #endif 34 35 #else 36 37 #ifdef CONFIG_MODVERSIONS 38 #define MODULE_VERMAGIC_MODVERSIONS "modversions " 39 #else 40 #define MODULE_VERMAGIC_MODVERSIONS "" 41 #endif 42 43 #endif 44 45 #ifndef MODULE_ARCH_VERMAGIC 46 #define MODULE_ARCH_VERMAGIC "" 47 #endif 4,但是cat /proc/devices 时没有看到相关信息(主次设备号),在/dev/中也没有相应的节点。 5,最高不清楚的是在中断没有打印(我把中断级别调到8了),在/var/volatile/log/messages中也没有相关打印信息。 6,我怀疑是不是没有调用到源文件中module_init中的函数,就写了一个hello_world模块程序。问题是同样的。
LINUX网卡驱动用iperf测试UDP丢包
大神们好,小弟最近做了一个LINUX网卡驱动,用iperf来测试时候,发现UDP有丢包。 用iperf测试UDP,一共测试两次,一次一个小时,速率为1000M,丢包率大概在0.0001%左右 再继续测试时,发现会大量丢包,已经惨不忍睹了,不知道什么问题,现在把收发代码贴出来,请大家指正一下: /*发送回调函数*/ ``` netdev_tx_t net_tx (struct sk_buff *skb, struct net_device *dev) { NET_PRIV *net_priv = netdev_priv(dev); unsigned long flags; PNET_SKB_DATA pskb ; spin_lock_irqsave(&net_priv->send_lock, flags); /*list_skbPool pool中取一个pskb*/ pskb = (PNET_SKB_DATA)listGetFirstNodeFromList(&net_priv->dev->list_skbPool); /*如果没取到,则返回*/ if(pskb == NULL) { spin_unlock_irqrestore(&net_priv->send_lock, flags); return NETDEV_TX_BUSY; } /*取到一个pskb后,把这个pskb从队列list_skbPool移除*/ pskb = listRemoveNodeFromListHead(&net_priv->dev->list_skbPool); /*把skb挂在pskb中*/ pskb->skb = skb; /*把pskb插入队列list_skbSend尾部,等待另外一个线程来取数据,继而发送出去*/ listAddNodeToListTail(pskb, &net_priv->dev->list_skbSend); dev->trans_start = jiffies; up(net_priv->dev->semElsSend); spin_unlock_irqrestore(&net_priv->send_lock, flags); return NETDEV_TX_OK; } ``` 此时另外有一个线程,在不断取数据,取到后就发送出去。 接收时,是一个线程一直从链路上收数据,收到数据就调用下面这个接收函数 /*接收函数*/ ``` int net_rx(unsigned char *data, unsigned int len, struct net_device *dev) { struct sk_buff *skb = NULL; NET_PRIV *net_priv = netdev_priv(dev); unsigned long flags; /*分配套接字缓冲区*/ skb = dev_alloc_skb(len + 2); if(skb == NULL) { printk("%s:memory is not sufficient, rcvd packet dropped.\n", dev->name); dev->stats.rx_dropped++; return -1; } skb_reserve(skb, 2); skb->dev = dev; memcpy(skb_put(skb, len), data, len); skb->protocol = eth_type_trans(skb, dev); if(NET_RX_SUCCESS != netif_receive_skb(skb)) { dev->stats.tx_errors ++; dev->stats.tx_dropped ++; return -2; } /*接收包统计*/ dev->stats.rx_packets ++; dev->stats.rx_bytes += len; return 0; } ``` 之前加了一些统计打印,发现从链路及驱动里面没有丢包。 丢包发生在送给协议栈后,在协议栈丢掉了 通过命令netstat -su发现打印如下: Udp: 30681696 packets received 71 packets to unknown port received. 436 packet receive errors 266 packets sent 436 receive buffer errors 0 send buffer errors IgnoredMulti: 393 其中436 packet receive errors 这个统计值436,正好就是iperf统计的丢包数量。 在网上搜了很多,说是当出现packet receive errors 的时候,说明是应用层来不及接收导致的。但是我用两台PC机(linux系统)进行测试,没有丢包。 这个问题困惑了很久,希望得到大神指点,谢谢!
LINUX内核usb驱动,如何知道数据正在USB接口上传输(包括读写)?
开始数据传输必调用的内核函数是哪个? 数据传输结束必调用的内核函数是哪个? 另外我想在开始和结束的时候做标记,吐一个信息到/tmp/dataTransferSymbol; 或者吐到系统日志也行,设备运行过程中使用dmesg能看到数据传输标志,怎么实现呢? 请高手赐教。谢谢。
linux socket can通信,接收端收到的帧包乱序问题,急!
linux socket can通信,接收端收到的帧包乱序问题,急! CAN网络设计为1个主机(linux平台)8个从机(STM32裸跑),目前在主机上遇到一个偶尔出现的问题:主机在应用层收到从机发来的CAN帧有乱序的情况(只是帧乱序,每个帧内的字节没有乱序)。 举个例子:假设某个从机先发A、再发B这个两个帧,主机在应用层调用read函数却是先读到B帧、再读到A帧。 已经排查过的结论: 1、从机发送出来的帧没有乱序。 2、由于linux下CAN设备被封装为网络设备,驱动层就是标准的网络设备驱动的写法:在接受函数中把收到的can数据填进struct sk_buff *skb,然后调用netif_rx(skb)通知内核已经接收到包。已经确认在调用netif_rx(skb)之前也没有乱序。 3、主机应用程序代码中对CAN设备的访问不存在竞争。 由上面分析,CAN数据是应该是在内核中被调乱了顺序。但是本人对内核和网络协议不熟悉,本来想跟着看看内核代码弄清楚数据是怎么一层层传递到应用层的,结果看了两天内核代码,晕头转向,能力有限又急着定位,希望有朋友能帮忙分析一下,非常感谢。
Ubuntu 视频采集卡驱动open 失败 errno=13
环境: Ubuntu 桌面版 内核:3.0.0-12-generic 现象: 系统已安装视频采集卡驱动,系统重启后,进行入到登录界面。此时,不进行登录操作。 用另一台机远程ssh过去。在ssh是执行程序,调用open函数打开设备。此时,设备打不开。 open函数失败 errno=13。 如果此时。通过主机的登录界面进行登录。成功登录后.再用ssh执行程序,调用open打开设备是成功的。 问题: 为什么一定要登录桌面后。调用open去打开设备才能成功。
linux 内核 spi驱动出错
请教,我在linux下(2.6.32)进行gpio模拟spi操作,但是当我调用spi_register_board_info 函数的时候,代码死机了,其具体情况如下: static struct spi_board_info stm32_board_info = { .modalias = "stm32-spi", .max_speed_hz = 10000000, .bus_num = 1, .mode = SPI_MODE_0, }; ret = spi_register_board_info(&stm32_board_info, 1); 死机了: do_cpu invoked from kernel context![#1]: Cpu 0 $ 0 : 00000000 004fdbd6 0000001f 00000001 $ 4 : 81c97c84 00000001 ffffffff 80126830 $ 8 : 3a207061 72616c6c 00000000 7271210a $12 : 7fa41760 00103044 2a60d837 00000000 $16 : 826e02c0 81fa1e08 826e0000 7fa417f0 $20 : 81fa1e08 0049a688 004e9d90 004fdb68 $24 : 00000000 80125f34 $28 : 81fa0000 81fa1930 004fdbc6 81c82684 Hi : 00000000 Lo : 17b44000 epc : 801df82c spi_register_board_info+0x4/0xa0 // 该接口挂了 Tainted: P ra : 81c82684 para_init+0x30/0xd8 [umac] Status: 1000ff03 KERNEL EXL IE Cause : 9080002c PrId : 00019374 (MIPS 24Kc) Modules linked in: wvas_wloc wbs_sec aclk rg_data_plane efqos_kernel roamk rg_wvlan proc_info ar93xx_et eth_subif umac ath_dev(P) ath_rate_atheros(P) ath_hal asf(P) adf(P) wbs_fwd_intf capwap_kernel rg_wlibk wbuf wbs_mng ef_bridge_ko af_packet ipv4 ref_ip eth_parser srvk net2con fpm_k ref_frame lsm_ko wbs_dev dm_chardev env_utils setmac_utils product_info_utils get_envi mtdoops rg_console rg_sysfs rg_thread_det rg_lowmem_killer rg_dprintk Process wbs_mng.elf (pid: 603, threadinfo=81fa0000, task=82a64038, tls=2aab7770) Stack : 00000009 81c8c89c 00000000 00000010 826e02c0 81c81094 81fa1a88 81fa1b70 00000006 00000000 00000001 00000000 00000005 00000001 81fa1e08 81c4bd1c 00000000 00000042 004fdbc6 00000010 00000000 00000000 81fa1b2c 00000000 00000000 00000001 81fa1a50 81fa1a5c 81fa1a50 00000003 00000000 00000000 00060000 8089c000 00000000 00060001 000000ff 00000000 00060000 004e0000 ... Call Trace: [<801df82c>] spi_register_board_info+0x4/0xa0 [<81c82684>] para_init+0x30/0xd8 [umac] [<81c81094>] rj_ath_wloc_set_tcl_cb+0x12c/0x14c [umac] [<81c4bd1c>] ath_ioctl+0x1b8/0x82c [umac] [<80160688>] dev_ioctl+0x664/0x71c [<80089920>] vfs_ioctl+0x2c/0x70 [<8008a008>] do_vfs_ioctl+0x5a0/0x5f8 [<8008a0a8>] sys_ioctl+0x48/0x7c [<80004124>] stack_done+0x20/0x3c Code: 000003f1 0001678c 00000004 <1100000d> 00000001 00016620 00000000 1100fff1 000004d2 Fatal exception: panic in 5 seconds Kernel panic - not syncing: Fatal exception Call Trace: [<800074bc>] dump_stack+0x8/0x34 [<80007550>] panic+0x68/0x13c [<8000f8d8>] die+0xc8/0xd0 [<8000fa24>] do_cpu+0x38/0x268 [<80002400>] ret_from_exception+0x0/0xc [<801df82c>] spi_register_board_info+0x4/0xa0 [<81c82684>] para_init+0x30/0xd8 [umac] [<81c81094>] rj_ath_wloc_set_tcl_cb+0x12c/0x14c [umac] [<81c4bd1c>] ath_ioctl+0x1b8/0x82c [umac] [<80160688>] dev_ioctl+0x664/0x71c [<80089920>] vfs_ioctl+0x2c/0x70 [<8008a008>] do_vfs_ioctl+0x5a0/0x5f8 [<8008a0a8>] sys_ioctl+0x48/0x7c [<80004124>] stack_done+0x20/0x3c 自身没感觉到调用的时候产生了啥错误,请帮忙指点下;
使用RC522写入block 0,写特殊指令0x40和0x43时超时。
使用树莓派SPI驱动RC522模块,读取block 0数据成功,但是写入block 0失败。参照网上资料,写入block 0前需要先写入两个特殊指令0x40和0x43,但是当我通过调用函数 ``` MFRC522_WriteReg(BitFramingReg, 0x07) MFRC522_ToCard(PCD_TRANSCEIVE, 0x40) //0x40 MFRC522_WriteReg(BitFramingReg, 0x00) MFRC522_ToCard(PCD_TRANSCEIVE, 0x43) //0x43 ``` 写入这两个命令时总是报错超时失败。但是其他request,select等流程调用 这两个函数都能成功,是在不知哪里有问题。怀疑是不是买的卡片不支持写入block 0,但是买的时候确实说是支持的。 下面是具体代码: ``` RC522.py: import RPi.GPIO as GPIO import spi import signal import time class MFRC522: PCD_IDLE = 0x00 # cancel current command PCD_AUTHENT = 0x0E # authent PCD_RECEIVE = 0x08 # receive data PCD_TRANSMIT = 0x04 # send data PCD_TRANSCEIVE = 0x0C # send & receive data PCD_RESETPHASE = 0x0F # reset PCD_CALCCRC = 0x03 # CRC calculate PICC_REQIDL = 0x26 # detect cards, not slepp PICC_REQALL = 0x52 # detect cards, all PICC_ANTICOLL = 0x93 # anti collision PICC_SElECTTAG = 0x93 # select card PICC_AUTHENT1A = 0x60 # authent A PICC_AUTHENT1B = 0x61 # authent B PICC_READ = 0x30 # read block PICC_WRITE = 0xA0 # write block PICC_DECREMENT = 0xC0 # dec money PICC_INCREMENT = 0xC1 # inc money PICC_RESTORE = 0xC2 # send data to buf PICC_TRANSFER = 0xB0 # save date from buf PICC_HALT = 0x50 # idle status Reserved00 = 0x00 # register CommandReg = 0x01 CommIEnReg = 0x02 DivlEnReg = 0x03 CommIrqReg = 0x04 DivIrqReg = 0x05 ErrorReg = 0x06 Status1Reg = 0x07 Status2Reg = 0x08 FIFODataReg = 0x09 FIFOLevelReg = 0x0A WaterLevelReg = 0x0B ControlReg = 0x0C BitFramingReg = 0x0D CollReg = 0x0E Reserved01 = 0x0F Reserved10 = 0x10 ModeReg = 0x11 TxModeReg = 0x12 RxModeReg = 0x13 TxControlReg = 0x14 TxAutoReg = 0x15 TxSelReg = 0x16 RxSelReg = 0x17 RxThresholdReg = 0x18 DemodReg = 0x19 Reserved11 = 0x1A Reserved12 = 0x1B MifareReg = 0x1C Reserved13 = 0x1D Reserved14 = 0x1E SerialSpeedReg = 0x1F Reserved20 = 0x20 CRCResultRegM = 0x21 CRCResultRegL = 0x22 Reserved21 = 0x23 ModWidthReg = 0x24 Reserved22 = 0x25 RFCfgReg = 0x26 GsNReg = 0x27 CWGsPReg = 0x28 ModGsPReg = 0x29 TModeReg = 0x2A TPrescalerReg = 0x2B TReloadRegH = 0x2C TReloadRegL = 0x2D TCounterValueRegH = 0x2E TCounterValueRegL = 0x2F Reserved30 = 0x30 TestSel1Reg = 0x31 TestSel2Reg = 0x32 TestPinEnReg = 0x33 TestPinValueReg = 0x34 TestBusReg = 0x35 AutoTestReg = 0x36 VersionReg = 0x37 AnalogTestReg = 0x38 TestDAC1Reg = 0x39 TestDAC2Reg = 0x3A TestADCReg = 0x3B Reserved31 = 0x3C Reserved32 = 0x3D Reserved33 = 0x3E Reserved34 = 0x3F NRSTPD = 22 MAX_LEN = 18 MI_OK = 0 MI_NOTAGERR = 1 MI_ERR = 2 MI_TIMEOUT = 3 def __init__(self, dev='/dev/spidev0.0', spd=1000000): self.dev0 = spi.openSPI(device=dev, speed=spd) GPIO.setmode(GPIO.BOARD) GPIO.setup(self.NRSTPD, GPIO.OUT) GPIO.output(self.NRSTPD, 1) self.MFRC522_Init() def MFRC522_WriteReg(self, addr, val): spi.transfer(self.dev0, ((addr<<1)&0x7E, val)) def MFRC522_ReadReg(self, addr): val = spi.transfer(self.dev0, (((addr<<1)&0x7E) | 0x80, 0)) return val[1] def MFRC522_SetRegBitMask(self, reg, mask): tmp = self.MFRC522_ReadReg(reg) self.MFRC522_WriteReg(reg, tmp | mask) def MFRC522_ClearRegBitMask(self, reg, mask): tmp = self.MFRC522_ReadReg(reg) self.MFRC522_WriteReg(reg, tmp & (~mask)) def MFRC522_ToCard(self, command, sendData): retStatus = self.MI_OK backData = [] backLen = 0 irqEn = 0x00 waitIRq = 0x00 lastBits = None n = 0 i = 0 if command == self.PCD_AUTHENT: irqEn = 0x12 waitIRq = 0x10 if command == self.PCD_TRANSCEIVE: irqEn = 0x77 waitIRq = 0x30 self.MFRC522_WriteReg(self.CommIEnReg, irqEn|0x80) # enable interupt self.MFRC522_ClearRegBitMask(self.CommIrqReg, 0x80) # clear interupt flags self.MFRC522_SetRegBitMask(self.FIFOLevelReg, 0x80) # init FIFO self.MFRC522_WriteReg(self.CommandReg, self.PCD_IDLE) # cancel current command for i in range(len(sendData)): self.MFRC522_WriteReg(self.FIFODataReg, sendData[i]) self.MFRC522_WriteReg(self.CommandReg, command) if command == self.PCD_TRANSCEIVE: self.MFRC522_SetRegBitMask(self.BitFramingReg, 0x80) i = 2000 while True: n = self.MFRC522_ReadReg(self.CommIrqReg) i -= 1 if ~((i!=0) and ~(n&0x01) and ~(n&waitIRq)): break self.MFRC522_ClearRegBitMask(self.BitFramingReg, 0x80) if i != 0: if (self.MFRC522_ReadReg(self.ErrorReg) & 0x1B) == 0x00: if n & irqEn & 0x01: retStatus = self.MI_NOTAGERR if command == self.PCD_TRANSCEIVE: n = self.MFRC522_ReadReg(self.FIFOLevelReg) lastBits = self.MFRC522_ReadReg(self.ControlReg) & 0x07 if lastBits != 0: backLen = (n-1)*8 + lastBits else: backLen = n*8 if n == 0: n = 1 if n > self.MAX_LEN: n = self.MAX_LEN for i in range(n): backData.append(self.MFRC522_ReadReg(self.FIFODataReg)) else: retStatus = self.MI_ERR else: retStatus = self.MI_TIMEOUT return (retStatus, backData, backLen) def _CalulateCRC(self, indata): self.MFRC522_ClearRegBitMask(self.DivIrqReg, 0x04) self.MFRC522_SetRegBitMask(self.FIFOLevelReg, 0x80) for i in range(len(indata)): self.MFRC522_WriteReg(self.FIFODataReg, indata[i]) self.MFRC522_WriteReg(self.CommandReg, self.PCD_CALCCRC) i = 255 while True: n = self.MFRC522_ReadReg(self.DivIrqReg) i -= 1 if ~((i != 0) and ~(n&0x04)): break crc = [] crc.append(self.MFRC522_ReadReg(self.CRCResultRegL)) crc.append(self.MFRC522_ReadReg(self.CRCResultRegM)) return crc # function : read block # parameter : blockAddr(0~63) # return : retStatus # backData[16] def MFRC522_ReadBolock(self, blockAddr): retStatus = self.MI_OK # cmd: 0x0c # buf: 0x30 blockAddr crc[2] buf = [] buf.append(self.PICC_READ) buf.append(blockAddr) crc = self._CalulateCRC(buf) buf.append(crc[0]) buf.append(crc[1]) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) if (status != self.MI_OK) or (backLen != 8*self.MAX_LEN): retStatus = self.MI_ERR return (retStatus, backData) # function : write block # parameter : blockAddr(0~63) # writeData[16] # return : retStatus def MFRC522_WriteBlock(self, blockAddr, writeData): retStatus = self.MI_OK # cmd: 0x0c # buf: 0xA0 blockAddr crc[2] buf = [] buf.append(self.PICC_WRITE) buf.append(blockAddr) crc = self._CalulateCRC(buf) buf.append(crc[0]) buf.append(crc[1]) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) if (status != self.MI_OK) or ((backData[0]&0x0F) != 0x0A) or (backLen != 4): retStatus = self.MI_ERR if status == self.MI_OK: # cmd: 0x0c # buf: writeData[16] crc[2] buf2 = [] for i in range(16): buf2.append(writeData[i]) crc = self._CalulateCRC(buf2) buf2.append(crc[0]) buf2.append(crc[1]) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf2) if (status != self.MI_OK) or ((backData[0]&0x0F) != 0x0A) or (backLen != 4): retStatus = self.MI_ERR return retStatus def MFRC522_Init(self): self.MFRC522_Reset() self.MFRC522_WriteReg(self.TModeReg, 0x8D) self.MFRC522_WriteReg(self.TPrescalerReg, 0x3E) self.MFRC522_WriteReg(self.TReloadRegL, 30) self.MFRC522_WriteReg(self.TReloadRegH, 0) self.MFRC522_WriteReg(self.TxAutoReg, 0x40) self.MFRC522_WriteReg(self.ModeReg, 0x3D) self.MFRC522_AntennaOn() def MFRC522_Reset(self): # reg: 0x01 # buf: 0x0F self.MFRC522_WriteReg(self.CommandReg, self.PCD_RESETPHASE) def MFRC522_AntennaOn(self): # reg: 0x14 # buf: 0bxxxxxx11 temp = self.MFRC522_ReadReg(self.TxControlReg) if not(temp & 0x03): self.MFRC522_SetRegBitMask(self.TxControlReg, 0x03) def MFRC522_AntennaOff(self): # reg: 0x14 # buf: 0bxxxxxx00 self.MFRC522_ClearRegBitMask(self.TxControlReg, 0x03) # function : detect card # parameter : reqMode: detect mode # 0x52 = detect all cards # 0x26 = detect not sleep cards # return : retStatus # backData: card type, 2 bytes # 0x4400 = Mifare_UltraLight # 0x0400 = Mifare_One(S50) # 0x0200 = Mifare_One(S70) # 0x0800 = Mifare_Pro(X) # 0x4403 = Mifare_DESFire def MFRC522_Request(self, reqMode): retStatus = self.MI_OK self.MFRC522_WriteReg(self.BitFramingReg, 0x07) # cmd: 0x0c # buf: 0x26/0x52 buf = [] buf.append(reqMode) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) if (status != self.MI_OK) or (backLen != 0x10): retStatus = self.MI_ERR return (retStatus, backData) # function : anticoll # parameter : # return : retStatus # backData(Uid, 4 bytes) def MFRC522_Anticoll(self): retStatus = self.MI_OK serNumCheck = 0 self.MFRC522_WriteReg(self.BitFramingReg, 0x00) # cmd: 0x0c # buf: 0x93 0x20 buf = [] buf.append(self.PICC_ANTICOLL) buf.append(0x20) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) if (status==self.MI_OK) and (len(backData)==5): for i in range(4): serNumCheck ^= backData[i] if serNumCheck != backData[4]: retStatus = self.MI_ERR else: retStatus = self.MI_ERR return (retStatus, backData) # function : select card # parameter : Uid # return : retStatus def MFRC522_Select(self, Uid): retStatus = self.MI_OK serNumCheck = 0 # cmd: 0x0c # buf: 0x93 0x70 Uid[4] check crc[2] buf = [] buf.append(self.PICC_SElECTTAG) buf.append(0x70) for i in range(4): buf.append(Uid[i]) serNumCheck ^= Uid[i] buf.append(serNumCheck) crc = self._CalulateCRC(buf) buf.append(crc[0]) buf.append(crc[1]) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) if (status != self.MI_OK) or (backLen != 0x18): retStatus = self.MI_ERR return retStatus # function : auth sectorkey # parameter : authMode(PICC_AUTHENT1A/PICC_AUTHENT1B) # blockAddr # sectorkey(6 bytes) # Uid(4 bytes) # return : retStatus def MFRC522_Auth(self, authMode, blockAddr, sectorkey, Uid): retStatus = self.MI_OK # cmd: 0x0e # buf: authMode blockAddr sectorkey[6] Uid[4] buf = [] buf.append(authMode) buf.append(blockAddr) for i in range(6): buf.append(sectorkey[i]) for i in range(4): buf.append(Uid[i]) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_AUTHENT, buf) if (status != self.MI_OK) or not(self.MFRC522_ReadReg(self.Status2Reg)&0x08): retStatus = self.MI_ERR return retStatus # function : idle # parameter : # return : retStatus def MFRC522_Halt(self): retStatus = self.MI_OK # cmd: 0x0c # buf: 0x50 0x00 crc[2] buf = [] buf.append(self.PICC_HALT) buf.append(0) crc = self._CalulateCRC(buf) buf.append(crc[0]) buf.append(crc[1]) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) retStatus = status return retStatus def MFRC522_WriteCmd40(self): retStatus = self.MI_OK self.MFRC522_WriteReg(self.BitFramingReg, 0x07) # cmd: 0x0c # buf: 0x40 buf = [] buf.append(0x40) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) if (status != self.MI_OK) or (backData[0] != 0x0a): retStatus = status return retStatus def MFRC522_WriteCmd43(self): retStatus = self.MI_OK self.MFRC522_WriteReg(self.BitFramingReg, 0x00) # cmd: 0x0c # buf: 0x43 buf = [] buf.append(0x43) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) if (status != self.MI_OK) or (backData[0] != 0x0a): retStatus = status return retStatus def MFRC522_StopCrypto1(self): self.MFRC522_ClearRegBitMask(self.Status2Reg, 0x08) def MFRC522_CloseSPI(self): spi.closeSPI(self.dev0) main.py: import RPi.GPIO as GPIO import MFRC522 import signal rc = MFRC522.MFRC522() dataBlock0 = [0x65, 0xa0, 0x8a, 0xe1, 0xae, 0x08, 0x04, 0x00, 0x01, 0x69, 0x21, 0x1a, 0x3c, 0xeb, 0xa9, 0x1d] sectorkey = [0xff, 0xff, 0xff, 0xff, 0xff, 0xff] def read_block0(): (status, tagType) = rc.MFRC522_Request(rc.PICC_REQIDL) if status != rc.MI_OK: print("MFRC522_Request error") return print("MFRC522_Request success, tagType: %#x %#x" %(tagType[0], tagType[1])) (status, Uid) = rc.MFRC522_Anticoll() if status != rc.MI_OK: print("MFRC522_Anticoll error") return print("MFRC522_Anticoll success, Uid: %#x %#x %#x %#x" %(Uid[0], Uid[1], Uid[2], Uid[3])) status = rc.MFRC522_Select(Uid) if status != rc.MI_OK: print("MFRC522_Select error") return print("MFRC522_Select success") status = rc.MFRC522_Auth(rc.PICC_AUTHENT1A, 1, sectorkey, Uid) if status != rc.MI_OK: print("MFRC522_Auth error") return print("MFRC522_Auth success") (status, dataBlock0) = rc.MFRC522_ReadBolock(0) if status != rc.MI_OK: print("MFRC522_ReadBolock error") return print("MFRC522_ReadBolock success, block0: %#x %#x %#x %#x %#x %#x %#x %#x %#x %#x %#x %#x %#x %#x %#x %#x" %(dataBlock0[0], dataBlock0[1], dataBlock0[2], dataBlock0[3], dataBlock0[4], dataBlock0[5], dataBlock0[6], dataBlock0[7], dataBlock0[8], dataBlock0[9], dataBlock0[10], dataBlock0[11], dataBlock0[12], dataBlock0[13], dataBlock0[14], dataBlock0[15])) rc.MFRC522_StopCrypto1() def write_block0(): (status, tagType) = rc.MFRC522_Request(rc.PICC_REQIDL) if status != rc.MI_OK: print("MFRC522_Request error") return print("MFRC522_Request success, tagType: %#x %#x" %(tagType[0], tagType[1])) (status, Uid) = rc.MFRC522_Anticoll() if status != rc.MI_OK: print("MFRC522_Anticoll error") return print("MFRC522_Anticoll success, Uid: %#x %#x %#x %#x" %(Uid[0], Uid[1], Uid[2], Uid[3])) status = rc.MFRC522_Select(Uid) if status != rc.MI_OK: print("MFRC522_Select error") return print("MFRC522_Select success") status = rc.MFRC522_Halt() print("MFRC522_Halt %d" %status) status = rc.MFRC522_WriteCmd40() if (status != rc.MI_OK): print("MFRC522_ToCard 0x40 error, status:%d" %status) return print("MFRC522_ToCard 0x40 success") status = rc.MFRC522_WriteCmd43() if (status != rc.MI_OK): print("MFRC522_ToCard 0x43 error, status:%d" %status) return print("MFRC522_ToCard 0x43 success") status = rc.MFRC522_WriteBlock(0, dataBlock0) if status != rc.MI_OK: print("MFRC522_WriteBlock error") return print("MFRC522_WriteBlock success") rc.MFRC522_StopCrypto1() def closeSPI(): rc.MFRC522_CloseSPI() if __name__ == '__main__': while True: action = input("Enter action r/w: ") if action == 'r': read_block0() elif action == 'w': write_block0() elif action == 'q': closeSPI() break print("exit procedure") ``` 下面是执行解过,读取成功,但是写入报错超时: ![图片说明](https://img-ask.csdn.net/upload/201910/28/1572228464_990828.png)
如何用exec往可执行文件里传值
我有a.c和p.py,我打算把a.c的输出通过匿名管道传给p.py 1.我写一个驱动c.c用fork创建一个子进程并且创间一个管道 2.父进程用exec函数调用编译好的a.c,这个时候我如何把c的输入传到管道fp[1]的写端? 而且c的输出是以什么方式传到fp[1]的?是printf还是传一个指针变量?
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
win10系统安装教程(U盘PE+UEFI安装)
一、准备工作 u盘,电脑一台,win10原版镜像(msdn官网) 二、下载wepe工具箱  极力推荐微pe(微pe官方下载) 下载64位的win10 pe,使用工具箱制作启动U盘打开软件,   选择安装到U盘(按照操作无需更改) 三、重启进入pe系统   1、关机后,将U盘插入电脑 2、按下电源后,按住F12进入启动项选择(技嘉主板是F12)     选择需要启
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
Nginx 软件层面加强Nginx性能优化的面试问答和解决方案
Nginx 软件层面加强Nginx性能优化的面试问答和解决方案 去年我去爱卡汽车面试PHP,一轮和二轮面的都不错,在三轮面到Nginx的时候很多问题当时不知道怎么回答,确实没有深入学习过,花了一段时间的学习,终于能解答Nginx高性能优化的问题了,10月24号为了获得程序员勋章,发布了半个优化笔记,浏览到了1000+,受到这个鼓舞,我抽时间在仔细整理下关于Nginx性能优化的问题,我们从软件说起。...
【管理系统课程设计】美少女手把手教你后台管理
【文章后台管理系统】URL设计与建模分析+项目源码+运行界面 栏目管理、文章列表、用户管理、角色管理、权限管理模块(文章最后附有源码) 1. 这是一个什么系统? 1.1 学习后台管理系统的原因 随着时代的变迁,现如今各大云服务平台横空出世,市面上有许多如学生信息系统、图书阅读系统、停车场管理系统等的管理系统,而本人家里就有人在用烟草销售系统,直接在网上完成挑选、购买与提交收货点,方便又快捷。 试想,若没有烟草销售系统,本人家人想要购买烟草,还要独自前往药...
11月19日科技资讯|华为明日发布鸿蒙整体战略;京东宣告全面向技术转型;Kotlin 1.3.60 发布
「极客头条」—— 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。扫描上方二维码进入 CSDN App 可以收听御姐萌妹 Style 的人工版音频哟。 一分钟速览新闻点! 6G 专家组成员:速率是 5G 的 10 至 100 倍,预计 2030 年商用 雷军:很多人多次劝我放弃WPS,能坚持下来并不是纯粹的商业决定 ...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n
化繁为简 - 腾讯计费高一致TDXA的实践之路
导语:腾讯计费是孵化于支撑腾讯内部业务千亿级营收的互联网计费平台,在如此庞大的业务体量下,腾讯计费要支撑业务的快速增长,同时还要保证每笔交易不错账。采用最终一致性或离线补...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
Java学习笔记(七十二)—— Cookie
概述 会话技术: 会话:一次会话中包含多次请求和响应 一次会话:浏览器第一次给服务器发送资源请求,会话建立,直到有一方断开为止 功能:在一次会话的范围内的多次请求间,共享数据 方式: 客户端会话技术:Cookie,把数据存储到客户端 服务器端会话技术:Session,把数据存储到服务器端 Cookie 概念:客户端会话技术,将数据存储到客户端 快速入门: 使用步骤: 创建C
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆  每天早上8:30推送 作者| Mr.K   编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯
程序员该看的几部电影
##1、骇客帝国(1999) 概念:在线/离线,递归,循环,矩阵等 剧情简介: 不久的将来,网络黑客尼奥对这个看似正常的现实世界产生了怀疑。 他结识了黑客崔妮蒂,并见到了黑客组织的首领墨菲斯。 墨菲斯告诉他,现实世界其实是由一个名叫“母体”的计算机人工智能系统控制,人们就像他们饲养的动物,没有自由和思想,而尼奥就是能够拯救人类的救世主。 可是,救赎之路从来都不会一帆风顺,到底哪里才是真实的世界?
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
@程序员,如何花式构建线程?
作者 |曾建责编 | 郭芮出品 | CSDN(ID:CSDNnews)在项目和业务的开发中,我们难免要经常使用线程来进行业务处理,使用线程可以保证我们的业务在相互处理之间可以保证原子性...
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布了 2019年国民经济报告 ,报告中指出:年末中国大陆总人口(包括31个
强烈推荐10本程序员在家读的书
很遗憾,这个鼠年春节注定是刻骨铭心的,新型冠状病毒让每个人的神经都是紧绷的。那些处在武汉的白衣天使们,尤其值得我们的尊敬。而我们这些窝在家里的程序员,能不外出就不外出,就是对社会做出的最大的贡献。 有些读者私下问我,窝了几天,有点颓丧,能否推荐几本书在家里看看。我花了一天的时间,挑选了 10 本我最喜欢的书,你可以挑选感兴趣的来读一读。读书不仅可以平复恐惧的压力,还可以对未来充满希望,毕竟苦难终
Linux自学篇——linux命令英文全称及解释
man: Manual 意思是手册,可以用这个命令查询其他命令的用法。 pwd:Print working directory 显示当前目录 su:Swith user 切换用户,切换到root用户 cd:Change directory 切换目录 ls:List files 列出目录下的文件 ps:Process Status 进程状态 mk
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
文章目录1. 前言2. 数据下载3. 数据处理4. 数据可视化 1. 前言 今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。 2月6日追记:本文发布后,腾讯的数据源多次变更u
智力题(程序员面试经典)
NO.1  有20瓶药丸,其中19瓶装有1克/粒的药丸,余下一瓶装有1.1克/粒的药丸。给你一台称重精准的天平,怎么找出比较重的那瓶药丸?天平只能用一次。 解法 有时候,严格的限制条件有可能反倒是解题的线索。在这个问题中,限制条件是天平只能用一次。 因为天平只能用一次,我们也得以知道一个有趣的事实:一次必须同时称很多药丸,其实更准确地说,是必须从19瓶拿出药丸进行称重。否则,如果跳过两瓶或更多瓶药
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
2020年的1月,我辞掉了我的第一份工作
其实,这篇文章,我应该早点写的,毕竟现在已经2月份了。不过一些其它原因,或者是我的惰性、还有一些迷茫的念头,让自己迟迟没有试着写一点东西,记录下,或者说是总结下自己前3年的工作上的经历、学习的过程。 我自己知道的,在写自己的博客方面,我的文笔很一般,非技术类的文章不想去写;另外我又是一个还比较热衷于技术的人,而平常复杂一点的东西,如果想写文章写的清楚点,是需要足够...
别低估自己的直觉,也别高估自己的智商
所有群全部吵翻天,朋友圈全部沦陷,公众号疯狂转发。这两周没怎么发原创,只发新闻,可能有人注意到了。我不是懒,是文章写了却没发,因为大家的关注力始终在这次的疫情上面,发了也没人看。当然,我...
Java坑人面试题系列: 包装类(中级难度)
Java Magazine上面有一个专门坑人的面试题系列: https://blogs.oracle.com/javamagazine/quiz-2。 这些问题的设计宗旨,主要是测试面试者对Java语言的了解程度,而不是为了用弯弯绕绕的手段把面试者搞蒙。 如果你看过往期的问题,就会发现每一个都不简单。 这些试题模拟了认证考试中的一些难题。 而 “中级(intermediate)” 和 “高级(ad
Spring Boot 2.x基础教程:使用JdbcTemplate访问MySQL数据库
在第2章节中,我们介绍了如何通过Spring Boot来实现HTTP接口,以及围绕HTTP接口相关的单元测试、文档生成等实用技能。但是,这些内容还不足以帮助我们构建一个动态应用的服务端程序。不论我们是要做App、小程序、还是传统的Web站点,对于用户的信息、相关业务的内容,通常都需要对其进行存储,而不是像第2章节中那样,把用户信息存储在内存中(重启就丢了!)。 对于信息的存储,现在已经有非常非常多...
基于Python的人脸自动戴口罩系统
目录 1、项目背景 2、页面设计 3、器官识别 4、退出系统 1、项目背景 2019年新型冠状病毒感染的肺炎疫情发生以来,牵动人心,举国哀痛,口罩、酒精、消毒液奇货可居。 抢不到口罩,怎么办?作为技术人今天分享如何使用Python实现自动戴口罩系统,来安慰自己,系统效果如下所示: 本系统的实现原理是借助 Dlib模块的Landmark人脸68个关键点检测库轻松识别出人脸五官
节后首个工作日,企业们集体开晨会让钉钉挂了
By 超神经场景描述:昨天 2 月 3 日,是大部分城市号召远程工作的第一天,全国有接近 2 亿人在家开始远程办公,钉钉上也有超过 1000 万家企业活跃起来。关键词:十一出行 人脸...
Java基础知识点梳理
Java基础知识点梳理 摘要: 虽然已经在实际工作中经常与java打交道,但是一直没系统地对java这门语言进行梳理和总结,掌握的知识也比较零散。恰好利用这段时间重新认识下java,并对一些常见的语法和知识点做个总结与回顾,一方面为了加深印象,方便后面查阅,一方面为了学好java打下基础。 Java简介 java语言于1995年正式推出,最开始被命名为Oak语言,由James Gosling(詹姆
jQuery实现高仿QQ音乐
几个实现的效果看视频吧: bandicam 2020-02-05 16-28-20-127 动图很是不清楚 github地址奉上:https://github.com/tangmusenLiu/Large-warehouse https://github.com/tangmu
为什么听过很多道理,依然过不好这一生?
记录学习笔记是一个重要的习惯,不希望学习过的东西成为过眼云烟。做总结的同时也是一次复盘思考的过程。 本文是根据阅读得到 App上《万维钢·精英日课》部分文章后所做的一点笔记和思考。学习是一个系统的过程,思维模型的建立需要相对完整的学习和思考过程。以下观点是在碎片化阅读后总结的一点心得总结。
2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!
新的一年来临,突如其来的疫情打破了平静的生活! 在家的你是否很无聊,如果无聊就来学习吧! 世上只有一种投资只赚不赔,那就是学习!!! 传智播客于2020年升级了Java学习线路图,硬核升级,免费放送! 学完你就是中级程序员,能更快一步找到工作! 一、Java基础 JavaSE基础是Java中级程序员的起点,是帮助你从小白到懂得编程的必经之路。 在Java基础板块中有6个子模块的学
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
相关热词 c# 识别回车 c#生成条形码ean13 c#子控制器调用父控制器 c# 写大文件 c# 浏览pdf c#获取桌面图标的句柄 c# list反射 c# 句柄 进程 c# 倒计时 线程 c# 窗体背景色
立即提问