Problema comunicazione tra PC con python ed ARDUINOUNO

di il
3 risposte

Problema comunicazione tra PC con python ed ARDUINOUNO

Salve, sto cencando di far comunicare il mio PC con Arduinouno.

In particolare devo far inviare la lettera “a" attraverso un programma in python ad ARDUINOUNO che la riceve attraverso un programma in C e la stampa nel monitor dell' IDE. Riporto di seguito il codice in python che invia la lettera “a”:import time

import time

import serial

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

    #ser.close()

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


dato = "aaa"

while 1:
    time.sleep(1)
    ser.write(dato)

Riporto di seguito il codice che riceve le lettera “a” lato ARDUINOUNO:



#include <TimerOne.h>
#define MAX_BUFFER 10

void read_USB();

int elemento_buffer=10;
char buffer[MAX_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(500000);     //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')
    {
      buffer[elemento_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
    }
    buffer[elemento_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(buffer[0] == 'a')     
  { 
    Serial.println(buffer); 
  }
  buffer[0]='0';    //pulisci buffer
}
}
    

void read_USB()
{ 
  if((Serial.available())>0)
  {
    buffer[0]='0';
  }
}

Avviando il programmino in python ottengo il seguente errore:

Il collegamento è stato effettuato con successo  

Traceback (most recent call last):
  File "/home/fabio/Scrivania/prova.py", line 23, in <module>
    ser.write(dato)
  File "/usr/local/lib/python3.10/dist-packages/serial/serialposix.py", line 616, in write
    d = to_bytes(data)
  File "/usr/local/lib/python3.10/dist-packages/serial/serialutil.py", line 65, in to_bytes
    raise TypeError('unicode strings are not supported, please encode to bytes: {!r}'.format(seq))
TypeError: unicode strings are not supported, please encode to bytes: 'aaa'

Il collegamento tra i due sistemi avviene ma mi da errore sulla write() e non capisco perchè. Aiutatemi per favore 

3 Risposte

  • Re: Problema comunicazione tra PC con python ed ARDUINOUNO

    L'errore è spiegato nel messaggio: in Python le stringhe sono Unicode UTF-8, nella libreria usata invece no.

    Converti la stringa in byte prima di mandarla al metodo ser.write(), prova con

    dato = b"aaa"
  • Re: Problema comunicazione tra PC con python ed ARDUINOUNO

    Ho scritto:

    import time
    import serial
    
    try:    
        ser = serial.Serial("/dev/ttyACM0", 115200)
        
        if ser.is_open:
           print ("\n Il collegamento è stato effettuato con successo  \n")
    
        #ser.close()
    
    except:
        print("""
        Collegamento fallito,
        controllare se il dispositivo è stato connesso correttamente,
        o di avere inserito il nome della porta corretto \n""")
    
    
    i=b'a'
    
    
    while 1:
        time.sleep(1)
        ser.write(i)

    e non vedo dall'altra parte nel terminale dell IDE di ARDUINO nessun carattere ‘a’ perchè?

    Riscrivo il codice di ARDUINO:

    
    
    #include <TimerOne.h>
    #define MAX_BUFFER 10
    
    void read_USB();
    
    int elemento_buffer=10;
    char buffer[MAX_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(500000);     //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')
        {
          buffer[elemento_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
        }
        buffer[elemento_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(buffer[0] == 'a')     
      { 
        //buffer[1]=0;
        Serial.println(buffer); 
      }
      buffer[0]='0';    //pulisci buffer
    }
    }
        
    
    void read_USB()
    { 
      if((Serial.available())>0)
      {
        Serial.println(buffer);
      }
    }

    Il problema è che non vedo nessuna ‘a’ dall altra parte nell IDE di ARDUINO. Perchè?

  • Re: Problema comunicazione tra PC con python ed ARDUINOUNO

    Ma perché elemento_buffer parte da 10? 

Devi accedere o registrarti per scrivere nel forum
3 risposte