Quero usar Python para enviar comandos para um bloco EV3. Em C ++ as coisas funcionam conforme o esperado - por exemplo, isso inicia o motor na porta A e, em seguida, para depois de um tempo:
#include <unistd.h> # include <fcntl.h>int main () {/ / comando para iniciar o motor na porta A na velocidade 20 char start_motor [] = "\ x0C \ x00 \ x00 \ x00 \ x80 \ x00 \ x00 \ xA4 \ x00 \ x01 \ x14 \ xA6 \ x00 \ x01"; // comando para parar o motor na porta A char stop_motor [] = "\ x09 \ x00 \ x01 \ x00 \ x80 \ x00 \ x00 \ xA3 \ x00 \ x01 \ x00"; // envia comandos para EV3 via bluetooth int bt = open ("/ dev / tty.EV3-SerialPort", O_RDWR); escrever (bt, start_motor, 14); usleep (500000); escrever (bt, stop_motor, 11); close (bt);}
Quando tento a mesma coisa em Python, entretanto, apenas o primeiro comando é executado (o motor dá partida, mas não para):
import time # command para iniciar o motor na porta A na velocidade 20start_motor = '\ x0C \ x00 \ x00 \ x00 \ x80 \ x00 \ x00 \ xA4 \ x00 \ x01 \ x14 \ xA6 \ x00 \ x01' + '\ n' # comando para parar o motor na porta Astop_motor = '\ x09 \ x00 \ x01 \ x00 \ x80 \ x00 \ x00 \ xA3 \ x00 \ x01 \ x00' + '\ n' # enviar comandos para EV3 via bluetoothwith open ('dev / tty.EV3-SerialPort', mode = 'w') como bt: bt.write (start_motor) time.sleep (5) bt.write (stop_motor)
Eu também tentei: suprimir o \ n
; usando os.open ('dev / tty.EV3-SerialPort', os.O_RDWR)
; usando bt.flush ()
; usando os.fsync (bt)
; usando bt = open (... (em vez de com)
; e alterando o modo e os argumentos de buffer do método aberto. Nada funcionou.
Bem, funcionaria se eu feche o tty e abra-o novamente, mas isso parece ineficiente:
# ... with open ('dev / tty.EV3-SerialPort', mode = 'w') as bt: bt .write (start_motor) time.sleep (5) com open ('dev / tty.EV3-SerialPort', mode = 'w') como bt: bt.write (stop_motor)
Então, o que estou perdendo aqui?
(OS X 10.9.3, Python 2.7.6, EV3 [31313])