2012-04-12 10 views
5

Sto leggendo i dati da un microcontrollore via seriale, a una velocità di trasmissione di 921600. Sto leggendo una grande quantità di dati CSV ASCII, e dato che è veloce, il buffer get riempito e tutto il resto dei dati si perde prima che io possa leggerlo. So che potrei modificare manualmente il codice sorgente pyserial per serialwin32 per aumentare la dimensione del buffer, ma mi chiedevo se c'è un altro modo per aggirarlo?Il buffer di Pyserial si riempie più velocemente di quanto possa leggere

Posso solo stimare la quantità di dati che riceverò, ma è da qualche parte circa 200kB di dati.

+0

È possibile rallentare la velocità di trasmissione? –

+0

No, sfortunatamente non ho il controllo del baud rate UC. Tutto quello che posso fare è inviare il byte di trasmissione e ricevere i dati. – Nate

risposta

4

C'è una Dispositivo di scorrimento "Ricevi buffer" accessibile dalla pagina delle proprietà della porta COM in Gestione periferiche. Si trova seguendo il pulsante Avanzate nella scheda "Impostazioni porta".

advanced settings for com port

Maggiori informazioni:

http://support.microsoft.com/kb/131016 nella rubrica buffer di ricezione

http://tldp.org/HOWTO/Serial-HOWTO-4.html nella rubrica Interrupt

Prova bussare giù una tacca o due.

+0

Lo farò anche io. Comunque sembra che aiuti solo con il buffer hardware, quindi anche se probabilmente sto sovraccaricando anche quel buffer, so che sto superando il buffer pySerial, che è la prima preoccupazione che devo affrontare. – Nate

+1

Sul mio Windows 7, l'impostazione sembra essere: Gestione periferiche | Porte | COMn | Proprietà | Impostazioni della porta | Avanzato | Ricezione (byte).Questo è un elenco a discesa e sono già al massimo di 4096. Il mio buffer sembra essere limitato a circa 2K. –

+0

Il motivo per cui le tue impostazioni non assomigliano all'immagine fornita da @jon è perché quella pagina microsoft si applica a ** windows 95 ** – krb686

4

Avete considerato la lettura dall'interfaccia seriale in un thread separato che esegue precedente all'invio del comando a uC per inviare i dati?

Questa operazione rimuoverà parte del ritardo dopo il comando di scrittura e l'avvio della lettura. Ci sono other SO users che hanno avuto successo con questo metodo, a condizione che non avessero sovraccarichi di buffer.

Se questo non è chiaro fammelo sapere e posso lanciare qualcosa insieme per mostrarlo.

EDIT

Pensandoci un po 'di più, se si sta cercando di leggere dal buffer e scriverlo fuori al file system, anche il filo autonomo potrebbe non risparmiare. Per ridurre al minimo il tempo di elaborazione si potrebbe considerare la lettura dire 100 byte alla volta serial.Read(size=100) e spingendo i dati in una coda per elaborare il tutto dopo il trasferimento è stato completato

pseudo codice di esempio

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

Farò un tentativo, anche se dopo aver fatto un po 'di matematica, non so ancora se questo sarà di aiuto. attualmente il buffer sarà sovraccaricato in 0,03 secondi. E per di più, sono abbastanza sicuro che non ci sia nemmeno una notifica di fine streaming. Le gioie dell'hardware homebrew. – Nate

+0

@Nate Questo è piuttosto veloce .... Controlla la mia modifica per ulteriori modi per velocizzarlo. –

Problemi correlati