无法从linux中读取字符设备

我正在为加速度计实现SPI驱动程序。 SPI部分已完成但我无法从用户空间读取值。

static char charDevMessage[CD_BUFFER_SIZE] = { 0 }; ... static ssize_t char_dev_read(struct file *filep, char *buffer, size_t len, loff_t *position) { int error_count = 0; struct xyz_values xyz; size_t size_requested; xyz = adxl345_get_xyz(); memset(charDevMessage, 0, CD_BUFFER_SIZE); sprintf(charDevMessage, "%d,%d,%d", xyz.x, xyz.y, xyz.z); printk(KERN_INFO "MOB: %s, requested size: %d\n", charDevMessage, len); if (len >= CD_BUFFER_SIZE) { size_requested = CD_BUFFER_SIZE; } else { size_requested = len; } error_count = copy_to_user(buffer, charDevMessage, size_requested); if (error_count == 0) { printk(KERN_INFO "MOB: Sent %d characters to the user\n", size_requested); return (size_requested = 0); } else { printk(KERN_INFO "MOB: Failed to send %d characters to the user\n", error_count); return -EFAULT; } } 

安装驱动程序时已创建节点。 但是,当我尝试使用cat或尝试通过python读取时,它返回一个空字符串。

dmesg表示它已成功发送到用户空间:

 [ 3094.495972] MOB: SPI Character device has been opened 1 time(s) [ 3094.506075] MOB: -349,-512,511 , requested size:49 [ 3094.514487] MOB: Sent 256 characters to the user [ 3094.522646] MOB: Character device successfully closed [ 3120.658568] MOB: SPI Character device has been opened 2 time(s) [ 3120.668609] MOB: 0,0,0 , requested size:48 [ 3120.676392] MOB: Sent 256 characters to the user [ 3120.684740] MOB: Character device successfully closed 

我究竟做错了什么?

你误解了.read函数的概念:

阅读器(用户空间)仅查看.read 返回 ,并将其解释为已读取的字节数

至于.read 的最后一个参数 (在你的情况下的position ),它的解释完全取决于驱动程序的作者 。 在打开文件时,由position指向的值由内核核心初始化为0。 在那之后,内核本身永远不会修改它。

如果您想始终从头开始阅读,您可能只是忽略position参数:

 return size_requested; 

或者,在语义上更好,您可以增加值,由position指向,因此它将反映读取的字节数。 但否则忽略它:

 *position += size_requested; return size_requested;