Forum >> Programmazione Python >> Scripting >> Problema con comunicazione tra PC ed ARDUINOUNO via USB

Pagina: 1

Salve sto tentando di far cumunicare tramite caratteri via USB Il PC con ARDUINOUNO.

Ho scritto il seguente codice lato PC con python3:

import time
import serial

try:    
    serial = serial.Serial("/dev/ttyACM0", 115200)
    
    if serial.is_open:
       print ("\n Il collegamento è stato effettuato con successo  \n")

    seriale.close()

except:
    print("""
    Collegamento fallito,
    controllare se il dispositivo è stato connesso correttamente,
    o di avere inserito il nome della porta corretto \n""")

while 1:
    time.sleep(1)
    serial.write('a')
    time.sleep(1)
    serial.write('a')
Lato ARDUINOUNO ho scritto il segue codice che dovrebbe ricevere dei caratteri


dal PC col codice python:



#include <TimerOne.h>
#define MAX_BUFFER 10

void read_USB();

int elemento_buffer=10;
char bufferMAX BUFFER;

void setup(void)
{
  Serial.begin(115200);
  while (!Serial)
    delay(10); // will pause Zero, Leonardo, etc until serial console opens

  Serial.println("OK!");
  Timer1.initialize(1000);     //testa se ci sono comandi sulla USB ogni 1msec
  Timer1.attachInterrupt(read_USB); // read USB to run every 0.15 seconds
}





void loop()
{  
  while((Serial.available())>0) 
  {      
    // se c'è qualche byte da leggere, allora...
    char carattere=Serial.read();      // ...leggi byte
    if(carattere=='\r') continue;
    if(carattere=='\n')
    {
      bufferelemento buffer=0;       // inserisco un carettere NULL per indicare la fine dell'array
      elemento_buffer=0;               // resetto l'indice dell'array
      break;                           // esco dal ciclo while
    }
    bufferelemento buffer=carattere; // creo l'array di caratteri
    elemento_buffer++;                 // incremento l'indice del buffer
    if(elemento_buffer==MAX_BUFFER)    // se si raggiunge il limite di byte del buffer allora...
    {
      elemento_buffer=MAX BUFFER-1;    // ...sovrascrivi quello precedente
    } 
  if(buffer0 == 'a')     
  { 
    Serial.println(buffer); 
  }
  buffer0='0';    //pulisci buffer
}
}
    

void read_USB()
{ 
  if((Serial.available())>0)
  {
    buffer0='0';
  }
}
Il codice ARDUINO è testato e funziona mentre il codice python3 non funziona e mi da il seguente errore:

  Collegamento fallito,
    controllare se il dispositivo è stato connesso correttamente,
    o di avere inserito il nome della porta corretto 

Traceback (most recent call last):
  File "/home/fabio/Scrivania/prova.py", line 20, in <module>
    serial.write('a')
AttributeError: module 'serial' has no attribute 'write'

Ho trovato in internet in un sito il codice python ma non capisco perche non funziona e mi da errore.

Aiutatemi per favore. :angry:







Ho trovato in internet in un sito il codice python ma non capisco perche non funziona e mi da errore.
Aiutatemi per favore. :angry:

È da ieri che guardo questo post sperando di NON risponderTi io, dato che non conosco "Arduino Uno" e che non ho mai avuto necessità di effettuare comunicazioni seriali, quindi non conosco nemmeno pySerial ... non parliamo, poi, del linguaggio C ... comunque, dato che il Tuo post sembra non aver solleticato alcun utente con conoscenze adeguate, proverò a darti un aiutino io.




Intanto, chiariamo che lo "aver trovato su internet" del codice python stabilisce che sei su di un percorso in salita, se non conosci python ... e da ciò che leggo sembra che qualche pecca in merito ci sia.

Una prima osservazione, riguardo al codice python, è che se vai a chiamare una Tua variabile "serial" vai a coprire, nello spazio dei nomi, il modulo "serial" che importi, peccato veniale nel Tuo codice ma che, comunque, induce a confusione, tant'è che Ti ha indotto a scriverlo come "seriale" per chiuderlo, faccenda che avrebbe generato un ulteriore errore se mai il codice fosse arrivato ad essere eseguito a quel punto ... stai stabilendo una connessione seriale no? Chiama, p.e., "s_conn".

Altro fattore critico sarebbe il chiudere la connessione prima ancora di utilizzarla per i "write" effettuati nel ciclo while ... se è chiusa, come farebbe a scrivere?

Ciliegina sulla torta, intercettare l'errore senza farsi dire "perché" avviene ...




nel Tuo codice stabilisci una connessione con "/dev/ttyACM0", non eccepisco su questo ma osservo che è una notazione del genere utilizzato su linux, apparentemente è tale istruzione che ti causa l'errore, sei sicuro che sia il tty giusto?, verificalo con un "lshw -short" (o "sudo lshw -short" se hai un sistema configurato con i sudoer's) ... o magari sei su windows (in tal caso, forse, sarebbe meglio indicare una porta COM)




... Non mi pronuncio sul codice C, ma prova ad utilizzare questo codice

import time
import serial

s_conn = None

try:    
    s_conn = serial.Serial("/dev/ttyACM0", 115200)
    
    if s_conn.is_open:
       print ("\n Il collegamento è stato effettuato con successo  \n")


except Exception as e:
    msg = f'Collegamento fallito :\n{e}'
    print(msg)

if not s_conn is None:
    response = 's'
    while response == 's':
        time.sleep(1)
        s_conn.write('a')
        time.sleep(1)
        s_conn.write('a')
        response = input('Premere "S" per continuare ').lower()

    s_conn.close()
a posto del Tuo (magari indicato "COM4" o qualcosa di simile al posto di "/dev/ttyACM0" se sei su windows) e vedi un po' cosa succede, se la connessione non riesce potrai postare il messaggio di errore restituito.




Ciao

Fatti non foste a viver come bruti...
Well, there are some issues with your python code, can you replace your code with this one.




import time

import serial




try:

ser = serial.Serial("/dev/ttyACM0", 115200)




if ser.is_open:

print("\nConnection was successful\n")




except Exception as e:

print(f"Connection failed: {e}\n")

exit()




while True:

time.sleep(1)

ser.write(b'a') # Use 'b' before the character to convert it to bytes

time.sleep(1)

ser.write(b'a') # Use 'b' before the character to convert it to bytes








Thanks


Pagina: 1



Esegui il login per scrivere una risposta.