[Python] [python] Help Lettura da Seriale
Manlio Perillo
manlio.perillo a gmail.com
Lun 4 Nov 2013 16:11:37 CET
On 04/11/2013 15:43, Riccardo Brazzale wrote:
> [...]
> Hai ragione,
> vediamo di ricapitolare:
> c'e' una macchina dotata di un pulsante, un display e una porta
> seriale.
> L'operatore deve fare delle misurazioni (in questo caso deve
> determinare, attraverso lo strumento di cui è dotata questa macchina
> le caratteristiche di un foglio di carta: porosità e
> spessore).Quando ha
> posizionato il foglio, schiaccia questo pulsante e la macchina
> mostra sul display i risultati.
> Contemporaneamente mette gli stessi risultati a disposizione
> sulla seriale.
> Ora, non essendoci niente collegato alla seriale, l'operatore
> trascrive
> i dati su un foglio e poi provvede a caricarli su un foglio xls.
> [...]
> Allego il sorgente:
>
Ti consiglio di organizzare il codice usando delle funzioni; altrimenti
così non è molto leggibile.
> #!/usr/bin/python
> # -*- coding: utf-8 -*-
> [...]
> while 1:
>
> dati = conn.read(64)
> stdscr.addstr(3, 20, dati)
> stdscr.refresh()
> fou.write(dati + "\n")
>
Come è il formato dei dati?
> stdscr.addstr(8, 5, 'PREMI Q PER USCIRE', curses.A_REVERSE)
Ok, allora premendo Q deve uscire e non semplicemente generare il file xls.
Curiosità: che succede se spegni l'apparecchio mentre questo programma è
in esecuzione? Si blocca indefinitamente su conn.read(64) ?
> stdscr.refresh()
> tasto_premuto = stdscr.getch() <== qui si blocca e attende e non va
> all'else
>
> if tasto_premuto == ord('q') or tasto_premuto == ord('Q'):
>
> # Chiudo il file temporaneo
>
> fou.close()
>
Il codice seguente è un ottimo candidato ad essere spostato in una
funzione, a cui passi il nome del file con i dati.
> [...]
>
> #chiudo
> curses.echo()
> curses.nocbreak()
> curses.curs_set(1)
> curses.endwin()
> sys.exit(0)
basta anche un semplice break.
Anzi è meglio, così puoi spostare il codice di inizializzazione e
terminazione delle curses fuori dal ciclo while (meglio se in funzioni
separate).
>
> else:
> a = 0
La variabile `a` a cosa serve?
> stdscr.addstr(8, 5, ' ')
> stdscr.refresh()
> continue
>
Comunque il codice lo puoi riscrivere in questo modo, tralasciando la
gestione degli errori:
import sys
import select
# ... open serial port, init curses
while 1:
rfd, wfd, efd = select.select([stdin, conn], [], [], 0)
if conn in rfd:
dati = conn.read(64)
# ... aggiorna schermo e file dati
if stdin in rfd:
cmd = stdin.read()
if cmd.strip().lower() == "q":
# ... salva il file excel
break
# close serial port, close curser
Ciao Manlio
Maggiori informazioni sulla lista
Python