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 从字符设备读取空字节数组的主要内容,如果未能解决你的问题,请参考以下文章