Параллельный принтер GPIO

import RPi.GPIO as GPIO
from time import sleep
import binascii
from thread import start_new_thread
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
D0=18
D1=23
D2=24
D3=25
D4=12
D5=16
D6=20
D7=21
STR=13
ACK=5
BUSY=6
GPIO.setup(D0, GPIO.IN) #D0
GPIO.setup(D1, GPIO.IN) #D1
GPIO.setup(D2, GPIO.IN) #D2
GPIO.setup(D3, GPIO.IN) #D3
GPIO.setup(D4, GPIO.IN) #D4
GPIO.setup(D5, GPIO.IN) #D5
GPIO.setup(D6, GPIO.IN) #D6
GPIO.setup(D7, GPIO.IN) #D7
GPIO.setup(STR, GPIO.IN) #STROBE
GPIO.setup(ACK, GPIO.OUT) #ACKN
GPIO.setup(BUSY, GPIO.OUT) #BUSY
GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_UP) #TEST
global D0_value
global D1_value
global D2_value
global D3_value
global D4_value
global D5_value
global D6_value
global D7_value
global data1
a=1
output=""
b=1
pin_list= [21,20,16,12,25,24,23,18]
GPIO.output(ACK, 1)
def bin2ascii(output):
        global b
        global bin
        global ascii
        bin=filter(str.isdigit, repr(output))
        ascii="".join(("0b", bin))
        n=int(ascii,2)
        print(binascii.unhexlify('%x' % n))
        GPIO.output(BUSY, 0)
        GPIO.output(ACK, 1)
def waitforstrobe(callback):
        global output
        GPIO.output(BUSY, 1)     
        GPIO.output(ACK, 0)
        data1=[GPIO.input(x) for x in pin_list]
        if not output:
                output=data1
        else:
                output+=data1
        GPIO.output(ACK, 1)
        start_new_thread(bin2ascii,(output,))
GPIO.add_event_detect(STR, GPIO.FALLING, callback=waitforstrobe, bouncetime=10)
print("Waiting for printsignal...")
GPIO.output(BUSY, 0)

Привет всем, я новичок в программировании с Rasbian.

Я хочу запрограммировать свой pi 3 так, чтобы pi отображал данные принтера.

Я припаял все линии данных, подтверждение строба и занятые линии к GPIO с помощью преобразователя уровня.

Моя проблема в том, что программа показывает только неправильные символы, декодированные из строк данных.

У меня такое ощущение, что процедура чтения и декодирования идет медленно, так что не все двоичные данные собираются.

Есть идеи, чтобы прога работала лучше?

Вход STR устанавливается с ПК, чтобы сигнализировать, что данные могут быть прочитаны. Занят от пи всегда, когда занят. ACK(подтверждение) устанавливается на низкий уровень, когда не готов к считыванию следующих 8 бит, и устанавливается на высокий уровень, когда готов к следующему набору данных.

Большое спасибо за помощь!

0 ответов

Другие вопросы по тегам