Acquisire dati di stampa dalla porta parallela LPT SPP

Buongiorno a tutti , con arduino sto cercando di acquisire i dati che un pc trasmette in stampa sulla porta parallela.
Il mio arduino si deve comportare come una stampante (solo testo) e per il momento mi accontento di vedere sul serial monitor i dati che arrivano dal pc.

Mi sono informato sul protocollo di stampa centronics e ho collegato i pin di dato (8 pin) , il segnale di strobe , ack , busy , select status, error e paper end al mio arduino (oltre a GND).

Poi ho scritto il software:

  1. prima di tutto imposto : select status = high , error = high , paper end = low
  2. poi imposto il segnale busy a low e attendo che il pc mi invii il segnale di strobe;
  3. appena intercetto il segnale strobe a low , attivo il segnale busy a high e leggo il dato;
  4. scrivo il dato sul serial monitor riparto dal punto 2;
/*
  LPT Sniffer v.1.1.3
  
  Lettura dati proveniente da una porta parallela/LPT in modalità SPP/Centronics
  by Roberto Paterniti
  
  Ricevi dati di stampa da cavo LPT in modalità SPP/Centronics.
  Il programma resta in attesa del segnale strobe nel ciclo principale.
  
  Scrivi in tempo reale sul monitor seriale il dato ricevuto in formato ascii; 
  
  bugfix:
  1.1.2 =  perdita di 40/50% strobe sulla chiusura del ciclo loop e suo richiamo -> spostato disattivazione segnale busy appena prima del ciclo di attesa di strobe
  1.1.3 =  perdita di alcuni strobe -> sostituzione digitalwrite e digitalread con istruzioni più veloci nel ciclo di attesa di strobe
 */
 
const int led = 13; // led 
 
//pin# Porta Parallela PC -> pin# Arduino 
const int nStrobe = 2; // Strobe (INPUT) : attivo basso (pulse LOW)

// Dato (INPUT)
const int dato0 = 4; // Dato 8bit - bit 1 (LOW bit)
const int dato1 = 5; // Dato 8bit - bit 2
const int dato2 = 6; // Dato 8bit - bit 3
const int dato3 = 7; // Dato 8bit - bit 4
const int dato4 = 8; // Dato 8bit - bit 5
const int dato5 = 9; // Dato 8bit - bit 6
const int dato6 = 10; // Dato 8bit - bit 7
const int dato7 = 11;// Dato 8bit - bit 8 (HIGH bit)

const int nAck = A0; // Ack (OUTPUT) : attivo basso (pulse LOW)
const int busy = A1; // Busy (OUTPUT) : attivo alto (HIGH)
const int paperEnd = A2; // Paper End (OUTPUT) : attivo alto (HIGH)
const int selectStatus = A3; // Seelect Status (OUTPUT) : attivi alto (HIGH)
const int nError = A4; // Error (OUTPUT) : attivo basso (LOW)

const int ackWait = 10; // microsecondi durata impulso negativo (LOW) di Ack (duarata default 8 microsecondi)

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  Serial.begin(9600); // per debug
  
  pinMode(nStrobe,INPUT);
  
  pinMode(dato0,INPUT);
  pinMode(dato1,INPUT);
  pinMode(dato2,INPUT);
  pinMode(dato3,INPUT);
  pinMode(dato4,INPUT);
  pinMode(dato5,INPUT);
  pinMode(dato6,INPUT);
  pinMode(dato7,INPUT);
  
  pinMode(nAck,OUTPUT);   
  digitalWrite(nAck,HIGH);  // setta stato iniziale HIGH
  
  pinMode(busy,OUTPUT);
  digitalWrite(busy,HIGH); // setta stato iniziale HIGH
  
  pinMode(paperEnd,OUTPUT);
  digitalWrite(paperEnd,LOW); // setta stato iniziale LOW
  
  pinMode(selectStatus,OUTPUT);
  digitalWrite(selectStatus,HIGH); // setta stato iniziale HIGH
  
  pinMode(nError,OUTPUT);
  digitalWrite(nError,HIGH); // setta stato iniziale HIGH
  
  pinMode(led, OUTPUT); //led     
}

// the loop routine runs over and over again forever:
void loop() {
  
  digitalWrite(led,HIGH); // attiva led (waiting...)
  PORTC &= B11111101; // disattiva segnale busy

  while ( PIND & 0b00000100 ) {
   //attendi fronte di discesa segnale di strobe 
  }
  
  PORTC |= B00000010; // attiva segnale busy (segnala che sono impegnato a leggere il dato)   
  digitalWrite(led,LOW); // Disattiva led (end waiting...)
 
  // Leggi e elabora dato - INIZIO
 
  boolean aDato[8]; 
  aDato[0]=digitalRead(dato0);
  aDato[1]=digitalRead(dato1);
  aDato[2]=digitalRead(dato2);
  aDato[3]=digitalRead(dato3);
  aDato[4]=digitalRead(dato4);
  aDato[5]=digitalRead(dato5);
  aDato[6]=digitalRead(dato6);
  aDato[7]=digitalRead(dato7);
  
  int datoInt = 0;
  int i;
  for (i=0;i < 8; i++) {
     bitWrite(datoInt,i,aDato[i]);  
  } 
  char datoChar = ' ';
  datoChar = char(datoInt);

  Serial.print(datoChar); // visualizza dato come char
  // Leggi e elabora dato - FINE
  
  //invia segnale nAck
  //digitalWrite(nAck,LOW);
  //delayMicroseconds(ackWait);
  //digitalWrite(nAck,HIGH);
}

Il programma legge i dati e li invia al serial monitor, ma spesso perdo dei caratteri.
Nei punti critici ho provato a sostituire le istruzioni digitalWrite e digitalRead con delle istrizioni più veloci andando a lavorare direttamente con le porte , ma senza risultato.
Cosa sbaglio ? Arduino è troppo lento e perdo dei segnali di strobe ??
Grazie per l’aiuto

Elimina i digitalread, sono troppo lenti. Lavora solo con le porte e con operazioni bitwise. Aggancia lo strobe ad un interrupt.

Grazie per la risposta , proverò a utilizzare un interrupt sul segnale di strobe .... Qualche suggerimento ?