sto cercando di fare una cosa abbastanza semplice ma non so perchè non ci sto riuscendo.
Ho un file di testo su pc che viene letto da uno script python molto semplice ed il testo viene dopodichè indirizzato sulla porta seriale alla quale è collagata la mia Arduino Uno.
I caratteri letti dallo script vengono codificati da UNICODE a UTF-8 dal metodo encode(). Questo è lo script:
import serial
ser = serial.Serial('COM3',9600)
import time
file = open("test.txt")
while 1:
line = file.readline()
print (line)
if not line:
break
ser.write(line.encode())
time.sleep(3)
file.close
print ("Terminato")
Dall' altra parte non faccio altro che leggere dalla porta seriale e provare a stampare i caratteri letti a video, così:
Buongiorno,
essendo il tuo secondo post, e anche nel precedente ti era stato chiesto, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentartiIN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.
Io proverei a mettere il while() di lettura da seriale all'interno della funzione loop(), per verificare se la funzione serialEvent() non dia problemi, e per qualche motivo che non conosco non venga eseguita.
paulus1969:
ma la porta Serial la usi contemporaneamente per comunicare col programma Python e per comunicare con il monitor seriale?
Lo script python apre la porta, legge dal file e butta lo stream sulla seriale. Una volta che ha finito di leggere dal file termina e chiude la comunicazione. Arduino è in ascolto sulla porta e quando c'è dello stream sul buffer dovrebbe catturarlo. Non so se con questo intendi che la porta è utilizzata contemporaneamente...
Forse il problema è la codifica del flusso in uscita dallo script Python. Quando in Python faccio
ser.write(b'ciao')
convertendo la stringa 'ciao' in byte riesco a catturare qualcosa dall' altra parte. Quando invece faccio
ser.write(linea.encode())
dove "linea" è la stringa che leggo dal file di testo non ricevo nulla su Arduino.
Come suggeritomi ho provato ad includere la gestione della lettura sulla porta in loop
void loop()
{
while(!Serial.available()) {
digitalWrite(LED_BUILTIN, LOW);
if (readString.length() >0)
Serial.println(readString);}
// serial read section
while (Serial.available())
{
if (Serial.available() >0)
{
digitalWrite(LED_BUILTIN, HIGH);
char c = Serial.read(); //gets one byte from serial buffer
readString += c; //makes the string readString
}
}
if (readString.length() >0)
{
Serial.print("Arduino received: ");
Serial.println(readString); //see what was received
}
delay(500);
}
Mandando da python una
ser.write(b'ciao')
entra nel while di lettura ed una volta che la porta non è più disponibile continua a stampare 'ciao' sul serial monitor..
Be nel loop() funziona correttamente. Il fatto che continui a stamparti la stringa "ciao" è giusto! Tu leggi i caratteri e le inseristi nella stringa, ma quando stampi non "cancelli" mai la stringa, per cui avrà lunghezza sempre superiore a zero e sarà sempre uguale a "ciao".
Per evitare che stampi sempre "ciao"
while(!Serial.available()) { // Quando non ci sono caratteri sulla seriale
digitalWrite(LED_BUILTIN, LOW);
if (readString.length() >0)
Serial.println(readString);// Stampo "ciao"
readString=""; // Stringa vuota di lunghezza zero
}
torn24:
Be nel loop() funziona correttamente. Il fatto che continui a stamparti la stringa "ciao" è giusto! Tu leggi i caratteri e le inseristi nella stringa, ma quando stampi non "cancelli" mai la stringa, per cui avrà lunghezza sempre superiore a zero e sarà sempre uguale a "ciao".
Per evitare che stampi sempre "ciao"
while(!Serial.available()) { // Quando non ci sono caratteri sulla seriale
digitalWrite(LED_BUILTIN, LOW);
if (readString.length() >0)
Serial.println(readString);// Stampo "ciao"
readString=""; // Stringa vuota di lunghezza zero
}
Ok ma non è questo il nocciolo del problema. Ho creato questo sketch per capire se il problema fosse lato trasmettitore o lato ricevente. A quanto pare è lato trasmettitore, perchè quando su Python mando staticamente ser.write(b'ciao') riceve correttamente la stringa "ciao" ed in qualche modo riesco a salvarla. Quando voglio invece fare una cosa dinamica ovvero leggere una riga dal file di testo con
line = file.readline()
ser.write(line.encode())
non riesco a recuperare nulla sul lato ricevente...