Arduino serial a través de python no funciona

0

Tengo un arduino corriendo con un bitlash corriendo conectado a un shiftbrite.

Puedo usar un programa de terminal para enviar comandos como rgb (1023,0,1023) y funcionará, pero cuando lo hago con python, no.

Aquí está mi código de python. No sé por qué no funciona. Incluso puedo imprimir la cadena en una pantalla LCD conectada a ella y sale correctamente

#Python Menu
#File: PythonMenu.py
#Basic menu system for use with Arduino and Shiftbrites
#over a wireless xbee link

import os #For clear
import time #For delay
import serial #For serial comms to the device

def printMenu():
    """Prints the menu ready with all options"""
    print "/--------------------------------------------\"
    print "|      |  | |  | /--- |  |  __  ---|         |"
    print "|      |--| |  | |  - |--| |__ |___          |"
    print "|      |  | |__| |__| |  | |__  ___|         |"
    print "|--------------------------------------------|"
    print "| Please select from the following options   |"
    print "|                                            |"
    print "| (1) White                                  |"
    print "| (2) Red                                    |"
    print "| (3) Green                                  |"
    print "| (4) Blue                                   |"
    print "| (5) Fade                                   |"
    print "| (6) Off                                    |"
    print "|--------------------------------------------|"
    print "| (0) Exit                                   |"
    print "\--------------------------------------------/"


def clear():
    """Clears the console screen"""
    os.system('clear')

def sendColour( r, g, b ):
    """Sends a RGB value to the shiftbrite"""
    #build up string
    tmpData = "rgb("
    tmpData += str(r)
    tmpData += ","
    tmpData += str(g)
    tmpData += ","
    tmpData += str(b)
    tmpData += ")"
    ser.write(tmpData)
    print(tmpData)

    return

###
#
###

#Setup serial
ser = serial.Serial('/dev/tty.usbserial-A600dJm8',9600)
#Start main code LOOP
while True:
    clear()
    printMenu()
    userInput = raw_input('Selection:')
    if userInput == '1':
        sendColour(1023,1023,1023)
    elif userInput == '2':
        sendColour(1023,0,0)
    elif userInput == '3':
        sendColour(0,1023,0)
    elif userInput == '4':
        sendColour(0,0,1023)
    elif userInput == '5':
        sendColour(0,0,0) #To be implemented
    elif userInput == '6':
        sendColour(0,0,0)
    elif userInput == '0':
        print "Quitting"
        ser.close()
        exit()
    time.sleep(2)

¿Alguien tiene alguna idea?

    
pregunta Ashley Hughes

1 respuesta

1

Creo que estás olvidando un carácter de salto de línea / retorno de carro para terminar el comando. Si escribes un comando en el terminal y presionas Enter, se enviarían.

Cambiar código a:

def sendColour( r, g, b ):
    """Sends a RGB value to the shiftbrite"""
    #build up string
    tmpData = "rgb("
    tmpData += str(r)
    tmpData += ","
    tmpData += str(g)
    tmpData += ","
    tmpData += str(b)
    tmpData += ")\n"
    ser.write(tmpData)
    print(tmpData)
    return

Observe el \ n .

El archivo bit lash-cmdline.c tiene esto dentro:

void doCharacter(char c) {
if ((c == '\r') || (c == '\n') || (c == ''')) {
    speol();
    *lbufptr = 0;
    doCommand(lbuf);
    initlbuf();
}

(resto de funciones no incluidas)

Esto sugiere que se puede usar un carácter '\ r', '\ n' o un '' 'para terminar el comando.

    
respondido por el geometrikal

Lea otras preguntas en las etiquetas