Comunicazione seriale senza monitor

se apro il serial monitor mi appare appunto 109 (m) e il led ci accende.
non credo che non comunichi via seriale perchè se ad esempio provo a scollegare arduino, mi segnala errore lo script.

veramente strano... sembra tanto qualche problema sulla porta seriale lato linux ma lascio la parola a chi è più esperto di me in tale S.O...

ad occhio direi che il SO non invii il carattere ma lo tenga nel buffer... esiste sicuramente un comando per forzare lo svuotamento del buffer, ad esempio flush (attento che alle volte flush CANCELLA e non svuota il buffer), se proprio non c'è allora chiudere la comunicazione dovrebbe forzare anche lo svuotamento del buffer

ho usato Serial.flush nello sketch ma non credo che il problema sia sulla comunicazione seriale perchè ho osservato che quando lancio lo script senza il monitor aperto si accendono comunque i led RX e L.
Non riesco a capire perchè ci vuole il monitor aperto per accendere il led...

ciao

forse più che nello sketch devi mettere il flush lato python...

sì infatti, il flush a lato pc, è da lì che il dato non parte :grin:

probabilmente aprire il serial monitor ti forza il flush della seriale, (e probabilmente chiude anche la seriale phyton), svelato il mistero

ho modificato il codice python ma non funge lo stesso...
ho forse sono io che non ho capito bene che fare.. XD

import serial, sys, feedparser

USERNAME="-----@gmail.com"
PASSWORD="--------"
PROTO="https://"
SERVER="mail.google.com"
PATH="/gmail/feed/atom"
SERIALPORT = "/dev/tty---" # Change this to your serial port!

try:
	ser = serial.Serial(SERIALPORT, 9600)
except serial.SerialException:
	print "no device connected - exiting"
	sys.exit()

newmails = int(feedparser.parse(PROTO + USERNAME + ":" + PASSWORD + "@" + SERVER + PATH)["feed"]["fullcount"])
ser.flush()
if ser.isOpen():
	if newmails > 0: 
		ser.write("m")
		print "some mail"
	else: 
		ser.write("n")
		print "no mail" 
ser.close()

ser.flush() mettilo dopo aver scritto, senò forzi la scrittura del buffer quando il buffer è ancora vuoto

prova a mettere il ser.flush() dopo il write()
anche se in teoria facendo close() dovrebbe forzare il flush dei buffers

ok lo messo dopo il write... ma non cambia niente... funziona sempre e solo con monitor aperto...

SERIALPORT = "/dev/tty---" # Change this to your serial port!

ma questo l'hai settato oppure no? e cmq a questo punto direi che è un problema col modulo pySerial.. l'hai installato a mano o da repository?

sisi lo settato se no mi avrebbe dato errore.
pyserial non ricordo... forse da repository cmq v 2.5
vorrei leggermi un po di documentazione sul sito ufficiale del progetto ma è due giorni che è down...

a me funziona... http://pyserial.sourceforge.net/

ciao

confermo, funziona

sono proprio sfortunato allora... XD
appena riesco ad accedere mi leggerò un pò di cosine sulla libreria, così magari capirò il problema..
grazie a tutti per le risposte XD

Ciao,

io penso che il problema sia dovuto al fatto che quando apri una connessione seriale arduino si resetta automaticamente, quindi non riceve i dati che gli invii perché si sta riavviando.
Il serial monitor ti mantiene aperta la connessione, per questo tutto funziona a dovere con quello aperto.

Due soluzioni:

  1. SW: inserisci un ritardo nel codice python, dopo aver aperto la connessione seriale e prima di inviare il dato.
    Fai due prove per il tempo, 1-3 secondi dovrebbero essere sufficienti.

  2. HW: per evitare l'autoreset ci sono due modi, che mi pare siano anche documentati da qualche parte su questo sito.
    SE usi arduino duemilanove, metti una resistenza da 120 ohm tra reset e 5V.
    SE usi arduino uno, metti un condensatore da 10uF tra reset e GND.

Personalmente ti consiglio la seconda: semplice, pulita, facilmente reversibile e soprattutto non devi litigare con i ritardi nelle sincronizzazione di invii/ricezioni.
Però dovrebbero funzionare entrambe.

Spero di esserti stato utile. :slight_smile:
Fammi sapere se funziona.

Valerio

Scusa ho lo stesso problema, pur usando php e non python..Utilizzando arduino uno.
Il condensatore lo devo mettere con positivo a reset e negativo a massa?

il "problema" lo avrai con qualsiasi terminale, perchè è la feature che ti permette di programmare arduino senza premere il tastino reset ogni volta)

Se volete risolvere del tutto senza componenti, dovete tagliare la pista RES-EN che c'è sulla schedina Arduino, in questo modo disattivate permanentemente il reset all'apertura del monitor. Così facendo però dovrete poi premere il pulsantino di reset a mano ogni volta che vuoi riprogrammare l'Arduino. Però è semplice ripristinare il collegamento, basta una goccia di stagno.