2014-01-29 4 views
8

Ich habe ein Gerät, das eine Zeichenfolge als Antwort auf Befehle zurückgibt, die in die Gerätedatei geschrieben wurden. Ich bin in der Lage Befehle an das Gerät zu schreiben und die Rückkehr Zeichenfolge in C mit Code zu lesen, die wie folgt aussieht:Wie führe ich Low-Level-I/O auf Linux-Gerätedateien in Python aus?

int dev = open("/dev/USBDev251",O_RDWR); 
write(dev,data,sizeof(data)); 
read(dev,buff,16); 

Der Versuch, das gleiche zu tun in Python mit:

dev = os.open("/dev/USBDev251",os.O_RDWR) 
os.write(dev, data) 
os.read(dev,16) 

Der Schreib ist erfolgreich, aber Es wird nur eine leere Zeichenfolge zurückgegeben. Was fehlt mir hier?

+0

Ist die erwartete Anzahl von Bytes os.write zurückkehren Sie schreiben wollte? – hogliux

+0

@hogliux, Ja, der Schreibvorgang ist erfolgreich. –

+0

Sind Sie sicher, dass das Gerät tatsächlich etwas zurückgibt? –

Antwort

6

Nach der os.write documentation:

Anmerkung: Diese Funktion für Low-Level bestimmt ist I/O und muss auf einen Dateideskriptor oder durch os.open()pipe() als Rück angewendet werden. Um ein "Dateiobjekt" zu schreiben, das von der integrierten Funktion open() oder popen() oder fdopen() oder sys.stdout oder sys.stderr zurückgegeben wird, verwenden Sie die Methode write().

Sie sollten hier nicht mischen und übereinstimmen. Wenn Sie die globale Funktion open() zum Öffnen einer Datei verwenden, müssen Sie nur die Methoden read() und write() des Dateiobjekts verwenden. Umgekehrt, wenn Sie os.open() verwenden, um eine Datei zu öffnen, dann müssen Sie nur os.read() und verwenden.

Versuchen Sie also, Ihren Anruf zu open() mit os.open() zu ersetzen; oder, halten Sie den open() Anruf, und ersetzen Sie os.write(dev, ...) durch dev.write(...) und ersetzen Sie os.read(dev, ...) durch dev.read(...).

+0

Entschuldigung. Ich habe tatsächlich os.open() benutzt. Die Frage wurde korrigiert. –

1

Fügen Sie eine os.lseek() hinzu, um an den Anfang der von Ihnen geschriebenen Zeichenfolge zu suchen. Zur Zeit haben Sie 16 Bytes geschrieben, die den Zeiger weiterleiten. Wenn Sie lesen, beginnen Sie mit dem Lesen des aktuellen Zeigers, so dass Sie ihn bis zum Anfang des geschriebenen Textes sichern müssen. Dieser arbeitete für mich:

#!/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) 
Verwandte Themen