Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
pySerial - Escribir datos en fichero txt
#1
hola, estoy interesada en hacer un puerto serie que lea los mensajes que le mando al puerto y me los guarde en un fichero txt. tengo el siguiente codigo, en "ser.read()" me lee solo 1 dato, si por ejemplo pongo mas solo me muestra el primero pero si por pongo ser.read(4), en este caso hasta que no llego a 4 caracteres no me manda el mensaje y me lo escribe en el txt, quiero poder mandarle cualquier mensaje sin limite de caracteres para que se envie y cualquier mensaje que me lo mande, no que vaya de 1 en 1, si no todos, espero que se me entienda, la segunda version del codigo es parecida pero me sale el mismo problema. un saludo.
Código:
import serial

file2=open('params.txt','w')

ser=serial.Serial(
    port ='COM17',
    baudrate = 115200)

data = ser.read()
data = data.replace(b'\r',b'')
data = data.replace(b'\x1b',b'')
dataASCII = data.decode("ascii")
file2.write(dataASCII)
file2.close


Código:
import serial
archi1=open("datos7.txt",'w')
ser=serial.Serial('COM17',baudrate = 115200)
try:
    ser.isOpen()
    print ("Reading open")
except:
    print ("Error")
    exit()


data = ser.read(4)
data = data.replace(b'\r',b'')
data = data.replace(b'\x1b',b'')
dataASCII = data.decode("ascii")

while data:
    print(data)
    if archi1.write(dataASCII):
        break
archi1.close()
Responder
#2
Hola, bienvenida.

Deberías hacer un bucle para recibir y escribir simultáneamente de a 1 byte:

Código:
while True:
    byte = ser.read()
    file2.write(byte)

No sé cuál sería la condición para terminar ese bucle (¿hay algún byte que indique que ya no hay más información por recibir?).

Saludos
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#3
(23-02-2022, 12:54 PM)Francisco escribió: Hola, bienvenida.

Deberías hacer un bucle para recibir y escribir simultáneamente de a 1 byte:

Código:
while True:
    byte = ser.read()
    file2.write(byte)

No sé cuál sería la condición para terminar ese bucle (¿hay algún byte que indique que ya no hay más información por recibir?).

Saludos

hola, queria leer frases completas sin importar el tamaño, le mando desde el movil un "hola" y quiero que eso me lo escriba en el txt, y "conexion establecida" y demas mensajes que le mande, cualquier dato, no solo 1 byte, tamppoco se como cerrar el bucle.
Responder
#4
Hola. Pero así no funciona el envío de datos. Tenés que ser específica respecto de a cuántos bytes querés leer información, y la función read() va a esperar hasta recibir esa cantidad de datos. Por esa razón, si querés que los datos se escriban ni bien arriban, entonces conviene leer de a 1 byte. No sé cómo funcionará en los puertos seriales, pero en las conexiones TCP/IP, cuando ya no hay más datos por leer, la función read() retorna una cadena vacía, de modo que generalmente se hace esto:

Código:
while True:
    byte = ser.read()
    if byte == b"":
        break
    file2.write(byte)

file2.close()

Saludos
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#5
bueno la solucion fue cambiar el timeout a algo mayor y en ser.read(x) siendo x un valor grande, el problema que tengo ahora es que a la hora de crear el fichero txt, todos los datos me los pone juntos pero da igual que añada \n porque todos los datos que recibe los considera como 1 este es mi codigo:

Código:
import serial

file2=open('params.txt','w')

ser=serial.Serial(
    port ='COM17',
    baudrate = 115200,
    timeout=30)
try:
    ser.isOpen()
    print ("Reading open")
except:
    print ("Error")
    exit()
data = ser.read(5000)
data = data.replace(b'\r',b'')
data = data.replace(b'\x1b',b'')

dataASCII = data.decode("ascii")
file2.write('envio de datos empezado\n')
file2.write(dataASCII)
file2.write('\nenvio de datos terminado')
file2.close
Responder
#6
Deberías enviar también desde el cliente los mensajes con un salto de línea al final para que se guarden de esa manera en el archivo.
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)