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
_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python

Rispondere a