Python 从字符设备读取空字节数组

Posted

技术标签:

【中文标题】Python 从字符设备读取空字节数组【英文标题】:Python reads empty bytearray from character device 【发布时间】:2021-06-21 05:38:49 【问题描述】:

我在运行 Debian 的工业 PC 上获得了一些 gpio 的字符设备。

用 C 语言阅读效果很好

#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main (int argc, char **argv) 
    int fd;
    fd = open("/dev/bsw_gpio", O_RDWR);
    if (fd == -1) 
        printf("could not open device");
        return 1;
    
    unsigned char val;
    int ret;
    ret = read(fd, &val, sizeof(val));
    if (ret == 0)
        printf("Value : %d\n", val);
    else
        printf("No val read\n");

    if(close(fd) != 0) 
        printf("Could not close file");
    
    
    return 0;

编辑

我忘了;这让我将两个 io 引脚的状态设为 0 到 3 之间的值并且运行良好。但我需要在 Python 中执行此操作。

而 Python 的反应方式是这样的

>>> import os
>>> fp = os.open("/dev/bsw_gpio", os.O_RDWR)
>>> os.read(fp, 1)
b''

或者,使用常开:

>>> with open('/dev/bsw_gpio', 'r+b', buffering=0) as fp:
...     fp.read()
... 
b''

我该如何解决这个问题?

【问题讨论】:

你能解释一下你期望的结果吗? Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers? 你试过用 sudo 运行你的脚本吗? @KlausD。我期望 0 到 3 之间的字节值 - 抱歉,忘了提这个。 -克劳斯D。我知道更快地得到我的答案无济于事.. 但它让我感觉更好 - SlLoWre 与 sudo 的结果相同。 您可能希望将其包含在问题中。 【参考方案1】:

我发现我需要读入一个固定大小的字节数组。由于之后需要转换为 int,所以我只使用了一个 2 字节的数组,将其反转并得到正确的值。

class DigitalIO():
   
    def __init__(self):
        '''
        öffne die Datei
        '''
            
        self.file = open(DigitalIO.FILENAME, 'r+b', 0)
    
    def read_value(self):
        '''
        lies einen Wert
        '''
        val = bytearray(2)
        self.file.readinto(val)
        val.reverse()
        return int(val.hex(), 16)

    def write_value(self, value):
        '''
        schreibe einen Wert
        '''
        self.file.write(value.to_bytes(1, 'little'))

【讨论】:

以上是关于Python 从字符设备读取空字节数组的主要内容,如果未能解决你的问题,请参考以下文章

Linux驱动字符设备驱动

Linux设备驱动之字符设备驱动

Linux 字符设备驱动及一些简单的Linux知识

使用校验和将字节数组转换为字符串。在 python 中重新迭代时获取额外的空字节

Linux驱动入门篇:基本的字符设备模块

字节流 字符流 - 12