问题描述
我在一台在 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''
我该如何解决这个问题?
解决方法
我发现我需要读入一个固定大小的字节数组。由于我需要在之后转换为 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'))