2017-02-13 12 views
0

Im пытается сделать небольшой 3 связанных роботов. Они должны отправлять и получать данные датчиков друг от друга и предпринимать действия для того, чтобы показания снова стали равными нулю. Iam пытается обменять угол движений, чтобы другой последовал за ним. Я использую MQTT, и он работает очень хорошо. Но когда я пытаюсь получить данные из def on_message, чтобы использовать его в следующем, а переменная не является глобальной. код следующим образом:Как получить данные из переменной в Def, чтобы использовать ее снаружи и остается обновленной?

############### MQTT section ################## 

# when connecting to mqtt do this; 
def on_connect(client, userdata, flags, rc): 
print("Connected with result code "+str(rc)) 
client.subscribe(sub_topic) 

# when receiving a mqtt message do this; 

def on_message(client, userdata, msg): 
masterangel = int(msg.payload) 
print (masterangel) 



client = mqtt.Client() 
client.on_connect = on_connect 
client.on_message = on_message 
client.connect(Broker, 1883, 60) 
client.loop_start() 

# Start the Program 
psm.screen.termPrintAt(1, "Press Go to stop program") 

while(not doExit): 

oldAngel = Angel 

Angel = gyro.readValue() 

Angelshow = "Current Angel ="+" "+str (Angel) 

if (oldAngel != Angel): 
    psm.screen.termPrintAt(5, Angelshow) 





if (Angel < masterangel) : 
    psm.BBM1.setSpeedSync(20) 
    psm.BAM1.floatSync() 

elif (masterangel < Angel) : 
    psm.BAM1.setSpeedSync(20) 
    psm.BBM1.floatSync() 

    client.publish(pub_topic, "test") 

теперь никому идея, как я могу использовать переменную «masterangel» в то время цикла? , кстати, порядок печати работ прекрасен.

print (masterangel) 

спасибо заранее, и я ценю вашу помощь

ответ

0

Вы должны инициализировать переменную вне области видимости функции onMessage, а затем пометить его как глобальную переменную в onMessage функций.

Посмотрите на ключевое слово python global.

############### MQTT section ################## 

# when connecting to mqtt do this; 
def on_connect(client, userdata, flags, rc): 
print("Connected with result code "+str(rc)) 
client.subscribe(sub_topic) 

# when receiving a mqtt message do this; 

def on_message(client, userdata, msg): 
# use global version not local 
global masterangel 
masterangel = int(msg.payload) 
print (masterangel) 



client = mqtt.Client() 
client.on_connect = on_connect 
client.on_message = on_message 
client.connect(Broker, 1883, 60) 
client.loop_start() 

# initialise variable to starting value 
masterangel = 0 

# Start the Program 
psm.screen.termPrintAt(1, "Press Go to stop program") 

while(not doExit): 

oldAngel = Angel 

Angel = gyro.readValue() 

Angelshow = "Current Angel ="+" "+str (Angel) 

if (oldAngel != Angel): 
    psm.screen.termPrintAt(5, Angelshow) 





if (Angel < masterangel) : 
    psm.BBM1.setSpeedSync(20) 
    psm.BAM1.floatSync() 

elif (masterangel < Angel) : 
    psm.BAM1.setSpeedSync(20) 
    psm.BBM1.floatSync() 

    client.publish(pub_topic, "test") 
+0

Спасибо, что сработало отлично! Спасибо за помощь :) –

-1

Чтобы избежать проблем, которые могут возникнуть с размаху переменных позже (т.е. смесительных локальные переменные с глобальными переменными), вместо того, чтобы использовать global ключевое слово, воспользоваться оператором возврата.

Другими словами, return позволяет фактически использовать аргументы, которые вы передаете в функцию возврата, и хранить их в другой переменной, тогда как print() просто печатает на экране.

############### MQTT section ################## 

# when connecting to mqtt do this; 
def on_connect(client, userdata, flags, rc): 
print("Connected with result code "+str(rc)) 
client.subscribe(sub_topic) 

# when receiving a mqtt message do this; 

def on_message(client, userdata, msg): 
masterangel = int(msg.payload) 
return (masterangel) # Use return() instead of print() 



client = mqtt.Client() 
client.on_connect = on_connect 
client.on_message = on_message 
client.connect(Broker, 1883, 60) 
client.loop_start() 

# Start the Program 
psm.screen.termPrintAt(1, "Press Go to stop program") 


#Assign the value of masterangel being returned by calling the on_message 
#function and storing it into its own variable. 

new_var = on_message() # This stores the returned value of masterangel 


while(not doExit): 

oldAngel = Angel 

Angel = gyro.readValue() 

Angelshow = "Current Angel ="+" "+str (Angel) 

if (oldAngel != Angel): 
    psm.screen.termPrintAt(5, Angelshow) 





if (Angel < new_var) : 
    psm.BBM1.setSpeedSync(20) 
    psm.BAM1.floatSync() 

elif (new_var < Angel) : 
    psm.BAM1.setSpeedSync(20) 
    psm.BBM1.floatSync() 

    client.publish(pub_topic, "test") 
+0

Это не сработает, потому что 'on_message' вызывается сетевым циклом, когда сообщение доставляется от брокера не в локальном коде, – hardillb

+0

@hardillb, спасибо, что указали это. –