意外的变量打印

时间:2015-01-03 17:01:15

标签: python mysql sql

我在Raspberry Pi上使用python从Arduino和mySQL数据库发送和接收变量,进行一些计算并将数据发送到适当的目的地。在脚本的开头我将数据保存在" oldVariables"查看数据库数据是否已更改。出于某种原因,我在0函数中将变量设置为1if,如果调用了该函数,则打印出6 ..我才开始使用python进行这个项目所以请随意批评我的代码,以便我可以改进它。这是我得到的:

这是返回6的部分(我发送" m发送" 6"来自Arduino on button事件):

arduino = ser.readline().strip()

    while arduino < 8:
        if (arduino == 6):
            if (oldAlarm == 0):
                aStat = 1
                armed = True
                os.system("python alarmOn.py")
            else:
                aStat = 0
                armed = False
            cur.execute("UPDATE elements SET value = %s WHERE element = 'Alarm'",
                (aStat))
            print aStat
            con.commit()
            arduino = ser.readline().strip()

由于某些或其他原因,更新数据库的唯一功能是LDR,其中if (arduino > 100):但更新数据库的其他功能看起来完全相同但他们没有更新,甚至在我进入之前while arduino < 8循环。 这就是剩下的......:

import MySQLdb as mdb
import sys
import serial
import os
import time

ser = serial.Serial('/dev/ttyACM1', 9600)
con = mdb.connect('10.0.0.100', 'pi', 'pi', 'Smart_Home')

arduino = 0
oldAlarm = 0
aStat = 0
rStat = 0
lStat = 0

armed = False

with con:

    cur = con.cursor()

    cur.execute("SELECT value FROM elements WHERE element='Alarm'")
    rows = cur.fetchone()
    for row in rows:
        oldAlarm = int(row)

    cur.execute("SELECT value FROM elements WHERE element='Relay'")
    rows = cur.fetchone()
    for row in rows:
        oldRelay = int(row)

    cur.execute("SELECT value FROM elements WHERE element='Motion'")
    rows = cur.fetchone()
    for row in rows:
        oldMotion = int(row)

    def triggerAlarm():
        global oldAlarm
        if (oldAlarm != alarm):
            ser.write('1')
            if (oldAlarm == 0):
                oldAlarm = 1
                armed = True
            else:
                oldAlarm = 0
                armed = False

    def triggerRelay():
        global oldRelay
        if (oldRelay != relay):
            ser.write('2')
            if (oldRelay == 0): oldRelay = 1
            else: oldRelay = 0

    def triggerMotion():
        global oldMotion
        if (oldMotion != motion & armed == True):
            ser.write('3')


    while True:
        arduino = ser.readline().strip()

        if (arduino > 100):
            lStat = arduino
            print lStat
            cur.execute("UPDATE elements SET value = %s WHERE element = 'LDR'",
                (lStat))
            con.commit()
            arduino = ser.readline().strip()

        while arduino < 8:
            if (arduino == 6):
                if (oldAlarm == 0):
                    aStat = 1
                    armed = True
                    os.system("python alarmOn.py")
                else:
                    aStat = 0
                    armed = False
                cur.execute("UPDATE elements SET value = %s WHERE element = 'Alarm'",
                    (aStat))
                print aStat
                con.commit()
                arduino = ser.readline().strip()

            if (arduino == 7):
                rStat = 1
                print rStat
                cur.execute("UPDATE elements SET value = %s WHERE element = 'Relay'",
                    (rStat))
                con.commit()
                arduino = ser.readline().strip()

            if (arduino == 8):
                rStat = 0
                print rStat
                cur.execute("UPDATE elements SET value = %s WHERE element = 'Relay'",
                    (rStat))
                con.commit()
            break;

        cur.execute("SELECT value FROM elements WHERE element = 'Alarm'")
        rows = cur.fetchone()
        for row in rows:
            alarm = int(row)
            triggerAlarm()

        cur.execute("SELECT value FROM elements WHERE element = 'Relay'")
        rows = cur.fetchone()
        for row in rows:
            relay = int(row)
            triggerRelay()

        cur.execute("SELECT value FROM elements WHERE element = 'Motion'")
        rows = cur.fetchone()
        for row in rows:
            motion = int(row)
            triggerMotion()
        print 'end'

很抱歉这段代码很长,但我学到的关于python的一件事是它对我来说非常难以预测,而且简单的错误可能在任何地方......

当我播出时,我的os.system("python alarmOn.py")在调用事件时也没有执行..:/

1 个答案:

答案 0 :(得分:1)

您的主要问题是您正在使用行

读取串行输入
arduino = ser.readline().strip()

将其与程序体中的整数进行比较,例如:if (arduino == 6)while arduino < 8

虽然Python 2在数字和字符串之间的<>比较中没有引发错误,但这是一个错误。在Python 2中,所有字符串都比任何数字都要大。 (因此,您的while arduino < 8永远不会输入)。在Python3中,程序会 此时只是打破了TypeError。 (==比较没有错,他们只是 从来都不是真的。)

所以,请记住,与SQL或ShellScript不同,Python是一种强类型语言 - 和数字根本不同于字符串。

如果您实际上是从arduino发送文本号码(ASCII字符用 字节值48 - 58),您必须在阅读后转换为int的整数:

arduino = int(ser.readline().strip())

另一方面,如果您要发送数字字节&#34; 8&#34;或&#34; 100&#34;在&#34; 0 - 255&#34;范围 从arduino中,您可以使用ord内置的Python获取数字:

arduino = 0
value = ser.readline().strip()
if value:
    arduino = ord(value)

您可能会在该代码中遇到其他问题,但修复此问题会使您按计划进行,以便了解正在进行的操作。由于您要打印值以检查发生了什么,请打印arduino变量,以便您知道实际发生了什么。 (您可以使用print repr(arduino)来区分字符串和整数值)