2014-12-12 3 views
0

Ниже приведен код, который я использую, чтобы вытащить некоторые серийные данные из ардуино. Этот оператор IF if (Ardinput == stagecode): Не использует глобальную переменную, объявленную ранее в той же функции. Я знаю его кое-что с моей логикой, я просто не уверен, что.Мои глобальные переменные не работают, как я представляю, они должны

EDIT Я добавил все мой код, чтобы помочь очистить вещи

stagecode = "STAGE " 

ser = serial.Serial(
port='COM3', 
baudrate=9600, 
) 



def stage(): 
      urllib.request.urlopen(url + 'f.stage') 


def capture(): 
    global Ardinput 
    print ("Start capture") 



    while (1):   
      line = ser.readline() 
      if (line != ""): 
       print (line) 
       Ardinput = line 
       Ardinput = Ardinput.decode("utf-8") 
       print (Ardinput + ' Befor CR') 
       Ardinput = Ardinput[:-1] 
       print (Ardinput) 
       done = Ardinput 
       break 
if (Ardinput == stagecode):  
    print (stagecode + ' IN IF FUNCTION') 
    #stage() 

print ("Start Application" + Ardinput ) 
print 

capture() 
+0

Такая же функция? Вы уверены, что ваш отступ здесь такой же, как и в вашем коде? – laike9m

+0

Я думаю, что вам действительно нужно выполнить 'capture()' перед оператором if. – Marcin

+0

Вы не присвоили значение по умолчанию или не получили значение в 'stagecode'? –

ответ

0

Ardinput Ваш переменной не придет в существование до тех пор, пока вы назвали capture() функции и что происходит после того, как if заявление.

Что у вас есть эквивалент:

def fn(): 
    global xyzzy 
    xyzzy = 42 

print xyzzy 
fn() 

, который будет генерировать ошибку. Вы должны на самом деле позвонитьfn(), чтобы создать переменную, прежде чем вы сможете ее использовать.

Другая возможность заключается в том, что ваш оператор if должен быть частью самой функции capture(), и в этом случае у вас просто неправильный отступ.

Как можно заметить, if и printнаходятся вне этой функции, следовательно, выполняется перед переменной вступает в существование.

Хороший способ проверить, почему инструкция if не работает, если вы уверены, что это должно быть, заключается в том, чтобы поставить временный код отладки перед if, распечатав длину и содержимое обоих переменные:

print "%d:[%s] %d:[%s]" % (len(Ardinput), Ardinput, len(stagecode), stagecode) 

Это должно надеяться выявить любые различия.

+0

К сожалению вот строки, которые были опущены, если (Ardinput == stagecode): печать (stagecode + 'IN IF FUNCTION') #stage() печати ("Start Application" + Ardinput) печать захвата () – cambria

+0

Я вижу, что вы говорили о том, что если вы являетесь внешним для блока функции, но я думаю, что я исправил это, но все же я получаю ту же проблему. есть идеи? – cambria

+0

@cambria, пожалуйста, не меняйте самого вопроса с редактированием, это делает идею SO полностью бесполезной. Особенной проблемой для этого вопроса является отступы. Если вы исправите это и все еще проблема, задайте новый вопрос. – paxdiablo

0

Похоже, вы ожидаете, что оператор if будет жить внутри функции capture(), но это не потому, что оно не имеет отступ.

В любом случае у вас не будет доступа к глобальному Ardinput до тех пор, пока не вызывается функция capture(). Поэтому, если вы не вызываете функцию перед вашим оператором if, вы получите сообщение об ошибке.