Forum >> Programmazione Python >> GUI >> Problema con ser.write()

Pagina: 1

Ho un problema con questo pezzo di codice:

try:
# Apri la porta seriale
ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)
print(f"Porta seriale /dev/ttyACM0 aperta con successo.")
time.sleep(2) # Attendi un momento per la connessione
values=['1000','1000','0','0','0','0','0']
values = [ [e.encode('UTF-8') for e in values]]
print(values)
# Invia i dati
ser.write(values)
#print("Dati inviati!")
# Chiudi la porta seriale
ser.close()
print("Porta seriale chiusa.")

except serial.SerialException as e:
print(f"Errore durante l'apertura o la comunicazione della porta seriale: /dev/ttyACM0")

se tento di inviare la stringa values mi da il seguente errore:

TypeError: 'list' object cannot be interpreted as an integer


Sto cercando di inviare lungo la USB verso un Arduinodue valori superiori a 256.

Nessuno mi puo' aiutare a capire che tipo di dati vuole ser.write() ?





--- Ultima modifica di fabio75 in data 2025-10-22 19:42:15 ---
Ciao caro, tralasciamo il fatto che non hai indentato correttamente il codice con l'apposito pulsantino, ma sei perdonato per questo peccato veniale.

Il problema sta nel fatto che ser.write() non accetta liste come nel tuo caso, ma bytes. Quindi devi trasformare, come un barbapapà, quello che gli passi altrimenti avrai sempre quel tipo di errore.

Ora vai e torna vincitore.
Ok quindi devo ciclare con for su ser.write():

ecco il codice.

values = app.freqa + app.mixa + app.freqb + app.mixb
print(app.values)
#invia modello
try:
# Apri la porta seriale
ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)
print(f"Porta seriale /dev/ttyACM0 aperta con successo.")
time.sleep(2) # Attendi un momento per la connessione
val = [ [e.encode('UTF-8') for e in values]]
print(val)
# Invia i dati
for char in range(len(val)):
ser.write(valchar)
print("Dati inviati!")
# Chiudi la porta seriale
ser.close()
print("Porta seriale chiusa.")

except serial.SerialException as e:
print(f"Errore durante l'apertura o la comunicazione della porta seriale: /dev/ttyACM0")

e mi da ancorar errore:

{0}
Porta seriale /dev/ttyACM0 aperta con successo.
Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python3.10/tkinter/__init__.py", line 1921, in __call__
    return self.func(*args)
  File "/media/fabio/6CA2E3C5A2E3923E/Progetti con eagle/SINTHETIZER/SOFTWARE/PC/prova.py", line 197, in invia
    val = [ [e.encode('UTF-8') for e in values]]
  File "/media/fabio/6CA2E3C5A2E3923E/Progetti con eagle/SINTHETIZER/SOFTWARE/PC/prova.py", line 197, in <listcomp>
    val = [ [e.encode('UTF-8') for e in values]]
AttributeError: 'int' object has no attribute 'encode'

Scusami la modalità ad indice su ser.write() ma provengo dal C.






No no, così sta cercando di fare .encode() su un int, non si può.

Devi fare una cosa del genere:

data = bytes(values)     # mi aspetterei una lista di int 0 -> 255
ser.write(data)


Altrimenti non ti andrà mai.
Il problema è che devo inviare char superiori a 256

potri avere valori con un massimo di 1500 o 100000.

Come posso fare? :angry:

--- Ultima modifica di fabio75 in data 2025-10-23 19:57:26 ---
Ricapitoliamo.

Non puoi usare .encode() su un int.

ser.write() accetta solo bytes, quindi devi impacchettare i numeri.

Se hai valori >255, usa struct.pack() per convertirli in uint32:
import serial, struct, time

values = [120, 1500, 50000, 100000]
data = b''.join(struct.pack('<I', v) for v in values)

with serial.Serial('/dev/ttyACM0', 9600, timeout=1) as ser:
    time.sleep(2)
    ser.write(data)
Prova una così e vedi se riesci a risolvere.

Cya
OK! Grazie, funziona! :ok:
It looks like ser.write() needs a bytes object, not a list. Try encoding each value to bytes before sending, or join them into a single string and encode it. For numbers above 255, you can use struct.pack() to send them as raw bytes. :)
Import this: curiosity, knowledge, friendship.
You're getting that error because ser.write()doesn't accept lists. It only accepts bytes, bytearray or encoded strings. Right now you're building a list of lists, so Python can't convert it into something the serial port can send. You need to turn your values ​​into a single bytes message before sending, either by encoding them as text or by packing them into a binary format if you need to transmit numbers above 256.










Python enthusiast, software developer, and tech blogger. Passionate about open-source projects, Python frameworks, and web development. Always learning new Python techniques and sharing insights. Join me for discussions on coding, AI, and data science!


Pagina: 1



Esegui il login per scrivere una risposta.