在Python中监视变量以进行更改

时间:2012-03-08 19:48:24

标签: python io hardware

首先,这可能会很长,所以请耐心等待,如果我的描述可能没有正确措辞,请提前抱歉,我不知道如何解释。

我是新来的和编程新手(除了Pascal的高中课程和C ++的大学课程,两个月前都有。)我正在教自己Python并尝试编写一个小项目来解决问题我我在上班。令人惊讶的是,到目前为止,我对我的项目表现相当不错,并且几乎让它工作但是我试图让它稍好一些。基本上我从串口读取数据,从所述读取中剥离回车,然后我尝试将我的串行输出与SQL数据库表中的记录匹配,并根据结果执行必要的操作。我已经完成了所有这些工作,但我遇到了一个我不确定如何解决的问题。

我正在使用“ctypes”与硬件制造商提供的DLL文件进行交互。有问题的硬件是数字I / O卡,有8个数字输入和8个继电器输出。 DLL允许我读取输入和输出的状态,我也可以控制输出(打开和关闭继电器)。基本上这样做是这样的:

mydll = cdll.LoadLibrary("acces32.dll")
input_status = mydll.InPortB(0xDC7C+1)

其中DC7C是HEX中卡的基地址,+1是输入状态的返回方式。输入状态以0到255的十进制形式返回,转换为二进制时表示8个输入的状态,即:

0 0 0 0 0 0 0 0 - decimal=0 - all inputs off
0 0 0 0 0 0 0 1 - decimal=1 - input 1 on
1 0 0 0 0 0 0 1 - decimal=129 - input 8 and 1 on
etc, etc, etc

我的设备目前正在使用前两个输入,所以我可能的结果是0,1,2或3.但考虑到所有可能性会很好但我不是很容易将我的头部数学包含在内确定哪些输入打开或关闭。我想要完成的是监视输入的状态,看它是关闭还是开启(0或1)。这是我目前的代码段:

def input():
    mydll = cdll.LoadLibrary("acces32.dll")
    input_status = mydll.InPortB(0xDC7C+1)

    while input_status != 1 or 3:
        arming = mydll.InPortB(0xDC7C+1)
        print "System is idle" #input 1 off
        #added the sleep as without it was using alot of CPU time
        time.sleep(0.5)
    print "Waiting for user input..." # then call bar_code function
    #calls another function which reads data from a serial connected bar code reader
    bar_code_reader()

虽然这或多或少有效但很明显并不理想,并且不考虑在运行“bar_code_reader”函数后输入1的状态发生变化时会发生什么。所以或多或少是实现这些输入的持续监视的正确方法,所以即使我处于bar_code_reader模式然后输入1更改为关闭程序将返回到“系统处于空闲状态”。

其次我没有考虑输入1打开的“input_status”的所有可能值,目前我只是考虑使用两个输入所以我知道值将是0,1,2或3但是如果我碰巧在将来使用其他输入我现在应该考虑到这一点,我想。当输入1打开时,是否有一种简单的方法来计算所有可能的值?我确信有一些简单的数学,我忘记了。我正在考虑将十进制输出转换为二进制并检查这种方式,但不确定这是否是最好的方法。我确实想出了如何转换为二进制文件,但就我所说的那样。

基本上总结一下:

当输入1为0时,系统保持空闲,而输入1为1则继续收集用户输入(以条形码的形式),但如果输入1返回0,则返回到空闲状态。

如果您需要查看更多代码或其他内容,请告诉我们。我知道这很长,而且我可能正在倒退......

提前致谢,

凯文

3 个答案:

答案 0 :(得分:2)

要检查输入1是否已打开,如果input_status & 0x1是整数,则可input_status

答案 1 :(得分:2)

听起来您有两个问题 - 如何知道input 1是否已启用,以及bar_code_reader如果input 1熄灭则会中止。

第一个很简单:如果第一位开启,input_status & 1将评估为True,否则为False

第二个有点棘手。

在正常情况下,bit 0仍然会在bar_code_reader()成功返回吗?

  • 如果是,请在尝试读取条形码后检查该位,如果它仍然存在,则表示您有良好的数据。

  • 如果不是,那么您必须将支票放入bar_code_reader本身(可能不止一次),然后bar_code_readerbit 0时返回一个好的值一直呆在那里,而None则不然。 (你可以使用None以外的任何一个,但这只是最常见的。)

哦,所以你不必记住哪个位字段等于什么数字:

BIT0 = 2 ** 0
BIT1 = 2 ** 1
BIT2 = 2 ** 2
BIT3 = 2 ** 3
BIT4 = 2 ** 4
BIT5 = 2 ** 5
BIT6 = 2 ** 6
BIT7 = 2 ** 7

答案 2 :(得分:1)

鉴于你只有8个可能的位,我建议最简单的做法就是对你的代码中格式化为二进制整数的掩码进行按位andor操作(ex 0b00000001) 。如果您也想要设置一系列值,例如:

inputs = []
for i in range(0, 8):
    input[i] = 2**i

然后在按位运算中使用inputs[i]而不是显式值。

至于你的另一个问题,你必须像其他人所指出的那样,在扫描方法中处理你的扫描方法。你将整个混乱置于while True循环中,然后在循环体中有if inputs[0] & input_status: bar_code_reader()