Comunicazione seriale senza monitor

Salve
sto testando uno sketch che riceve sulla porta seriale da uno script in python un valore n o m (in ascii)

int val;
const int LED = 9;

void setup()
{
    Serial.begin(9600);
    Serial.flush();
    pinMode(LED, OUTPUT);
}

void loop()
{
  if (Serial.available())
  {
    val = Serial.read();
    Serial.println(val);
    if (val == 110) // n = 110 in dec
    {
      digitalWrite(LED,LOW);
    }
    else if (val == 109) //109 = m in dec
    {
      digitalWrite(LED,HIGH);
      delay(3000);
      digitalWrite(LED,LOW);
    }
  }
}

lo sketch è molto semplice ed accende solo un led.
quando lancio lo script in python però, non funge se non apro il serial monitor dell’ide di arduino.
quando lo apro invece funziona a dovere.
come posso fare a non dover stare sempre con il monitor acceso??
grazie a tutti XD

ciao

la cosa è parecchio strana... non puoi avere due pc connessi alla medesima porta seriale quindi non capisco come possa funzionare sia il serial monitor che il tuo programma python contemporaneamente. Posta il programma così vediamo...

lo sript è questo... modificato a dovere ovviamente XD

import serial, sys, feedparser
#Settings - Change these to match your account details
USERNAME="XXXXXXX@gmail.com"
PASSWORD="PASSWORDXXWD"
PROTO="https://"
SERVER="mail.google.com"
PATH="/gmail/feed/atom"
SERIALPORT = "/dev/tty.usbserial-FTE3RS4J" # Change this to your serial port!
# Set up 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.open()
# Output data to serial port
if newmails > 0: 
    ser.write("m")
    print "some mail"
else: 
    ser.write("n")
    print "no mail" 
#print data to terminal


# Close serial port
ser.close()

ciao

quindi sei sotto linux... ma se lo lanci senza il serial monitor attivo ti stampa l'errore

no device connected - exiting

?

si sono sotto linux. se lo lancio senza il monitor attivo oppure anche senza IDE aperto mi stampa "some mail". solo se apro il monitor mi si accende il led, e non capisco il perchè...

ciao

mmm però se ti stampa "some mail" sembra riuscire a collegarsi via seriale... dovrebbe inviare "m" via seriale e arduino dovrebbe accendere il led (m in ascii equivale a 109). Se lasci aperto anche il serial monitor cosa vedi apparire?

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