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])