Saltar al contenido

python a arduino serie lectura y escritura

No busques más por otras webs porque has llegado al lugar justo, poseemos la solución que quieres pero sin liarte.

Solución:

No debería cerrar el puerto serie en Python entre la escritura y la lectura. Existe la posibilidad de que el puerto aún esté cerrado cuando Arduino responda, en cuyo caso se perderán los datos.

while running:  
    # Serial write section
    setTempCar1 = 63
    setTempCar2 = 37
    setTemp1 = str(setTempCar1)
    setTemp2 = str(setTempCar2)
    print ("Python value sent: ")
    print (setTemp1)
    ard.write(setTemp1)
    time.sleep(6) # with the port open, the response will be buffered 
                  # so wait a bit longer for response here

    # Serial read section
    msg = ard.read(ard.inWaiting()) # read everything in the input buffer
    print ("Message from arduino: ")
    print (msg)

el pitón Serial.read La función solo devuelve un solo byte de forma predeterminada, por lo que debe llamarla en un bucle o esperar a que se transmitan los datos y luego leer todo el búfer.

En el lado de Arduino, debe considerar lo que sucede en su loop función cuando no hay datos disponibles.

void loop()
{
  // serial read section
  while (Serial.available()) // this will be skipped if no data present, leading to
                             // the code sitting in the delay function below
  
    delay(30);  //delay to allow buffer to fill 
    if (Serial.available() >0)
    
      char c = Serial.read();  //gets one byte from serial buffer
      readString += c; //makes the string readString
    
  

En su lugar, espere al comienzo de la loop función hasta que lleguen los datos:

void loop()
{
  while (!Serial.available())  // wait for data to arrive
  // serial read section
  while (Serial.available())
  {
    // continue as before

EDITAR 2

Esto es lo que obtengo al interactuar con su aplicación Arduino desde Python:

>>> import serial
>>> s = serial.Serial('/dev/tty.usbmodem1411', 9600, timeout=5)
>>> s.write('2')
1
>>> s.readline()
'Arduino received: 2rn'

Así que parece estar funcionando bien.

Al probar su secuencia de comandos de Python, parece que el problema es que Arduino se reinicia cuando abre el puerto serie (al menos mi Uno lo hace), por lo que debe esperar unos segundos para que se inicie. También está leyendo una sola línea para la respuesta, así que también lo arreglé en el código a continuación:

#!/usr/bin/python
import serial
import syslog
import time

#The following line is for serial over GPIO
port = '/dev/tty.usbmodem1411' # note I'm using Mac OS-X


ard = serial.Serial(port,9600,timeout=5)
time.sleep(2) # wait for Arduino

i = 0

while (i < 4):
    # Serial write section

    setTempCar1 = 63
    setTempCar2 = 37
    ard.flush()
    setTemp1 = str(setTempCar1)
    setTemp2 = str(setTempCar2)
    print ("Python value sent: ")
    print (setTemp1)
    ard.write(setTemp1)
    time.sleep(1) # I shortened this to match the new value in your Arduino code

    # Serial read section
    msg = ard.read(ard.inWaiting()) # read all characters in buffer
    print ("Message from arduino: ")
    print (msg)
    i = i + 1
else:
    print "Exiting"
exit()

Aquí está el resultado de lo anterior ahora:

$ python ardser.py
Python value sent:
63
Message from arduino:
Arduino received: 63
Arduino sends: 1


Python value sent:
63
Message from arduino:
Arduino received: 63
Arduino sends: 1


Python value sent:
63
Message from arduino:
Arduino received: 63
Arduino sends: 1


Python value sent:
63
Message from arduino:
Arduino received: 63
Arduino sends: 1


Exiting

Primero hay que instalar un módulo llamado Serial. Para hacer eso, vaya a la carpeta llamada Scripts que se encuentra en la carpeta instalada de python. Si está utilizando la versión de Python 3, normalmente se encuentra en la ubicación a continuación,

C:Python34Scripts  

Una vez que abra esa carpeta, haga clic derecho en esa carpeta con shift key. Luego haga clic en 'abrir ventana de comando aquí'. Después cmd aparecerá. Escriba el siguiente código en ese cmd ventana,

pip install PySerial

y presione enter.después de eso PySerial se instalará el módulo. Recuerda que para instalar el módulo debes tener conexión a INTERNET.


después de instalar con éxito el módulo, abra python IDLE y escriba el siguiente código y ejecútelo.

import serial
# "COM11" is the port that your Arduino board is connected.set it to port that your are using        
ser = serial.Serial("COM11", 9600)
while True:
    cc=str(ser.readline())
    print(cc[2:][:-5])   

Te mostramos las reseñas y valoraciones de los usuarios

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *