Mensajes: 3
Temas: 1
Registro en: Feb 2022
Reputación:
0
23-02-2022, 10:51 AM
(Última modificación: 24-02-2022, 02:15 PM por Francisco.)
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()
Mensajes: 1.300
Temas: 3
Registro en: Feb 2016
Reputación:
71
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
Mensajes: 3
Temas: 1
Registro en: Feb 2022
Reputación:
0
(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.
Mensajes: 1.300
Temas: 3
Registro en: Feb 2016
Reputación:
71
24-02-2022, 02:13 PM
(Última modificación: 24-02-2022, 02:15 PM por Francisco.)
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
Mensajes: 3
Temas: 1
Registro en: Feb 2022
Reputación:
0
25-02-2022, 07:23 AM
(Última modificación: 25-02-2022, 11:43 AM por Francisco.)
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
Mensajes: 1.300
Temas: 3
Registro en: Feb 2016
Reputación:
71
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.
|