2012-04-12 2 views
5

Ich lese Daten von einem Mikrocontroller über serielle, mit einer Baudrate von 921600. Ich lese eine große Menge von ASCII-CSV-Daten, und da es so schnell kommt, bekommen die Puffer gefüllt und der Rest der Daten geht verloren, bevor ich es lesen kann. Ich weiß, dass ich den pyserial-Quellcode für serialwin32 manuell bearbeiten konnte, um die Puffergröße zu erhöhen, aber ich fragte mich, ob es einen anderen Weg gibt?Pyserial-Puffer füllt sich schneller als ich lesen kann

Ich kann nur die Menge der Daten schätzen, die ich erhalten werde, aber es ist irgendwo um 200kB Daten.

+0

Können Sie die Baudrate verringern? –

+0

Nein, leider habe ich keine Kontrolle über die Baudrate. Ich kann nur das Übertragungsbyte senden und die Daten empfangen. – Nate

Antwort

4

a Es ist abgeschlossen "Receive Buffer" -Regler, auf den über die Eigenschaftenseite des COM-Ports im Geräte-Manager zugegriffen werden kann. Sie finden es, indem Sie auf der Registerkarte "Port-Einstellungen" auf die Schaltfläche Erweitert klicken.

advanced settings for com port

Weitere Informationen:

http://support.microsoft.com/kb/131016 unter Überschrift Empfangspuffer

http://tldp.org/HOWTO/Serial-HOWTO-4.html unter der Rubrik Interrupts

Probieren Sie es klopfen eine Kerbe oder zwei nach unten.

+0

Ich werde dies auch versuchen. Es klingt jedoch so, als ob es nur mit dem Hardwarepuffer helfen würde. Obwohl ich wahrscheinlich auch diesen Puffer überholen werde, weiß ich, dass ich den pySerial-Puffer überlaufe, was die erste Sorge ist, die ich ansprechen muss. – Nate

+1

Auf meinem Windows 7 scheint die Einstellung: Geräte-Manager | Häfen | COMn | Eigenschaften | Porteinstellungen | Fortgeschritten | Empfangen (Bytes).Dies ist eine Drop-Down-Liste und ich bin bereits bei 4096. Mein Puffer scheint auf etwa 2K begrenzt zu sein. –

+0

Der Grund, warum Ihre Einstellungen nicht wie das von @jon bereitgestellte Bild aussehen, liegt daran, dass diese Microsoft-Seite für ** Windows 95 ** gilt. – krb686

4

Haben Sie darüber nachgedacht, von der seriellen Schnittstelle in einem separaten Thread zu lesen, die vor zum Senden des Befehls uC ausgeführt wird, die Daten zu senden?

Dies würde einen Teil der Verzögerung nach dem Schreibbefehl entfernen und den Lesevorgang starten. Es gibt other SO users, die Erfolg mit dieser Methode hatten, vorausgesetzt sie hatten keine Pufferüberläufe.

Wenn dies nicht klar ist, lass es mich wissen und ich kann etwas zusammen werfen, um dies zu zeigen.

EDIT

es Nachdenken über ein bisschen mehr, wenn Sie aus dem Puffer zu lesen sind versucht, und es schreiben, auch die Standalone-Thread auf das Dateisystem aus können Sie nicht speichern. die Verarbeitungszeit zu minimieren Sie serial.Read(size=100) Lesung sagen 100 Bytes zu einer Zeit betrachten könnten und diese Daten in eine Warteschlange schiebt es nach der Übertragung zu verarbeiten

Pseudo-Code Beispiel

def thread_main_loop(myserialobj, data_queue): 
    data_queue.put_no_wait(myserialobj.Read(size=100)) 

def process_queue_when_done(data_queue): 
    while(1): 
     if len(data_queue) > 0: 
      poped_data = data_queue.get_no_wait() 
      # Process the data as needed 
     else: 
      break; 
+0

Ich werde dies versuchen, obwohl ich nach ein wenig Mathe immer noch nicht weiß, ob das helfen wird. derzeit wird der Puffer in 0,03 Sekunden überlaufen. Und zu guter Letzt bin ich ziemlich sicher, dass es auch keine Ende-Stream-Benachrichtigung gibt. Die Freuden der Homebrew-Hardware. – Nate

+0

@Nate Das ist ziemlich schnell .... Schau dir meinen Schnitt an, um weitere Möglichkeiten zu finden, ihn zu beschleunigen. –