我有一个设备,它返回一个字符串以响应写入设备文件的命令。我能够向设备写入命令并在C中读取返回字符串,代码如下:
int dev = open("/dev/USBDev251", O_RDWR);
write(dev, data, sizeof(data));
read(dev, buff, 16);
我正在尝试用Python做同样的事情:
dev = os.open("/dev/USBDev251", os.O_RDWR)
os.write(dev, data)
os.read(dev, 16)
写入成功,但只返回空字符串。我在这里缺少什么?
答案 0 :(得分:7)
注意:此函数适用于低级I / O,必须应用于
os.open()
或pipe()
返回的文件描述符。要编写由内置函数open()
或popen()
或fdopen()
或sys.stdout
或sys.stderr
返回的“文件对象”,请使用其{{ 1}}方法。
你不应该在这里混合和匹配。如果使用全局函数write()
打开文件,则只能使用文件对象的open()
和read()
方法。相反,如果您使用write()
打开文件,则只能使用os.open()
和os.read()
。
因此,请尝试将os.write()
的来电替换为open()
;或者,保持os.open()
来电,并将open()
替换为os.write(dev, ...)
,并将dev.write(...)
替换为os.read(dev, ...)
。
答案 1 :(得分:2)
添加os.lseek()
以寻找您编写的字符串的开头。目前你写了16个字节来提升指针。当你阅读时,你开始阅读当前指针,所以你需要将它备份到你所写的开头。
这对我有用:
#!/usr/bin/python
import os
data = "xxxxxxxxxxxxxxxx"
dev = os.open("/dev/sdp1", os.O_RDWR)
os.write(dev,data)
os.lseek(dev,0,os.SEEK_SET)
print os.read(dev,16)
答案 2 :(得分:0)
问题出在设备驱动程序上。在驱动程序的read()
中注册的file_operations
方法被调用copy_to_user()
,但随后返回0
而不是复制到用户空间的字节数。
“有效” 上方的C代码,因为它实际上并未检查read()
的返回值,并且buff
的响应已填充。