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.stdoutosys.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.