[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