Pages: [1] 2   Go Down
Author Topic: Comunicazione seriale senza monitor  (Read 1477 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salve
sto testando uno sketch che riceve sulla porta seriale da uno script in python un valore n o m (in ascii)
Code:
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  smiley-lol
Logged

Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
Logged

lucadentella.it

Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

lo sript è questo... modificato a dovere ovviamente  smiley-lol
Code:
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()
Logged

Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao

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

no device connected - exiting

?
Logged

lucadentella.it

Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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è...
Logged

Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

lucadentella.it

Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
Logged

lucadentella.it

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10454
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
Logged

Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao

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

lucadentella.it

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10454
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

sì infatti, il flush a lato pc, è da lì che il dato non parte  smiley-mr-green

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

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho modificato il codice python ma non funge lo stesso...
ho forse sono io che non ho capito bene che fare..  smiley-lol
Code:
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()
Logged

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10454
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

lucadentella.it

Pages: [1] 2   Go Up
Jump to: