Tengo un dispositivo que devuelve una cadena en respuesta a los comandos escritos en el archivo del dispositivo. Puedo escribir comandos en el dispositivo y leer la cadena de retorno en C con un código que se parece a:
int dev = open("/dev/USBDev251", O_RDWR); write(dev, data, sizeof(data)); read(dev, buff, 16);
Estoy tratando de hacer lo mismo en Python con:
dev = os.open("/dev/USBDev251", os.O_RDWR) os.write(dev, data) os.read(dev, 16)
La escritura es exitosa, pero solo se devuelve una cadena vacía. ¿Que me estoy perdiendo aqui?
De acuerdo con la documentación de os.write
:
Nota: esta función está diseñada para E/S de bajo nivel y debe aplicarse a un descriptor de archivo como lo devuelve
os.open()
opipe()
. Para escribir un "objeto de archivo" devuelto por la función incorporadaopen()
o porpopen()
ofdopen()
, osys.stdout
osys.stderr
, use su métodowrite()
.
No deberías estar mezclando y combinando aquí. Si usa la función global open()
para abrir un archivo, solo debe usar los métodos read()
y write()
del objeto de archivo. Por el contrario, si usa os.open()
para abrir un archivo, solo debe usar os.read()
y os.write()
.
Entonces, intente reemplazar su llamada a open()
con os.open()
; o mantenga la llamada open()
y reemplace os.write(dev, ...)
con dev.write(...)
y reemplace os.read(dev, ...)
con dev.read(...)
.
Agregue un os.lseek()
para buscar de nuevo al comienzo de la cadena que escribió. Actualmente escribiste 16 bytes que avanzaron el puntero. Cuando lee, comienza a leer en el puntero actual, por lo que debe retroceder hasta el comienzo de lo que escribió.
Esto funcionó para mí:
#!/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)
El problema resultó estar en el controlador del dispositivo. El método read()
registrado con file_operations
del controlador invocó copy_to_user()
pero luego devolvió 0
en lugar del número de bytes copiados en el espacio de usuario.
El código C anterior "funcionó" porque en realidad no verificó el valor de retorno de read()
y buff
se estaba completando con la respuesta.