1

我想知道如何将并行端口上的数据引脚设置为高电平和低电平。我相信我可以为此使用 PyParallel,但我不确定如何设置特定的引脚。

谢谢!

4

2 回答 2

2

您在这里谈论的是软件-硬件接口。它们通常通过为寄存器分配一个 1 字节的值来设置低和高。并行端口有8 个引脚用于传输数据。在像 C、C++ 这样的低级语言中,会有一个寄存器,我们称之为“A”,在某处保存对应于 8 个数据引脚的 8 位。例如:

假设寄存器 A 设置为引脚:[7,6,5,4,3,2,1,0]

类 C 伪代码

A=0x00 // all pins are set low
A=0xFF // all pins are high
A=0xF0 // Pins 0:3 are low, Pins 4:7 are high

这个想法通过PyParallel

import parallel
p = parallel.Parallel() # open LPT1
p.setData(0x55) #<--- this is your bread and butter here  

p.setData 是您感兴趣的函数。 0x55 转换为二进制是

0b01010101

-或者-

[LHLHLHLH]

所以现在你可以将数据设置为某个字节,但是我将如何发送一堆数据......比如说 3 个字节 0x00、0x01、0x02?好吧,您需要查看 ack 行,以了解接收机器何时确认收到刚刚发送的任何内容。

一个天真的实现:

data=[0x00, 0x01, 0x02]
while data:
    onebyte=data.pop()
    p.setDataStrobe('low') #signal that we're sending data
    p.setData(onebyte)
    while p.getInAcknowledge() == 'high': #wait for this line to go 'low'
                                          # to indicate an ACK
        pass                              #we're waiting for it to acknowledge...
    p.setDataStrobe('high')#Ok, we're done sending that byte.

好的,这并不能直接回答您的问题。假设我只想将引脚 5 设置为高或低。也许我在那个引脚上有一个 LED。然后你只需要一点二进制操作。

portState = 0b01100000 #Somehow the parallel port has this currently set
newportState = portState | 0b00010000#<-- this is called a bitmask
print newportState 
>>> 0b011*1*0000

现在让我们清除那一点...

newportState = 0b01110000
clearedPin5 = newportState & 11101111
print clearedPin5
>>> 0b011*0*0000

如果这些二进制操作是外来的,我推荐这个关于 avrfreaks 的优秀教程。在进一步发展之前,我会与他们变得亲密。像这样的嵌入式软件概念充满了位掩码和位移。

于 2013-09-19T18:46:36.437 回答
2

我已经制作了这个函数来单独控制引脚(代码来自这里这里):

def setPin(pin,value):
    if(pin==1):
        p.setDataStrobe(value)
    elif(pin>=2 and pin<=9):
        pin = pin-2
        if(value==0):
            # clear the bit
            p.setData(p.getData() & (255 - pow(2, pin)))
        else:
            #set the bit
            p.setData(p.getData() | pow(2, pin))
    elif(pin==14):
        p.setAutoFeed(value)
    elif(pin==16):
        p.setInitOut(value)
    elif(pin==17):
        p.setSelect(value)
    else:
        raise(ValueError("invalid pin number"))
于 2017-02-28T15:20:56.197 回答