Newsgroup: it.comp.lang.c++
Titolo: Simulazione Stampante

Salve al NG,
    devo risolvere il seguente problema: ho un elaboratore dedicato che
esegue alcune procedure di calcolo e possiede una porta parallela con cui
stampa i calcoli su dei tabulati su una normale stampante a 9 aghi. Vorrei
simulare con un PC DOS il funzionamento della stampante in modo da acquisire
i dati inviati alla stampante e scriverli su un file. Come posso simulare
una stampante tramite la porta parallela bidirezionale del PC oppure dove
posso reperire informazioni ?
Grazie per l'eventuale aiuto.

...

Assumendo il trasferimento dati centronics:
Algoritmo di trasmissione di 1 byte:
PUT DATA(2-9)
WAIT (BUSY(11) basso)
    TOGGLE nSTROBE(1)
WAIT (TOGGLE nSTROBE)
Per ricevere tale gruppo di 8 bit da una porta bidirezionale
occorre un cavo con le seguenti incrociature:
 1 - 10  nSTROBE - nACK
 2 - 2   DATA    - DATA
 3 - 3   DATA    - DATA
 4 - 4   DATA    - DATA
 5 - 5   DATA    - DATA
 6 - 6   DATA    - DATA
 7 - 7   DATA    - DATA
 8 - 8   DATA    - DATA
 9 - 9   DATA    - DATA
10 - 1   nACK    - nSTROBE
11 - 14  BUSY    - SELECT
14 - 11  SELECT  - BUSY
18 - 18  GND     - GND
19 - 19  GND     - GND
20 - 20  GND     - GND
21 - 21  GND     - GND
22 - 22  GND     - GND
23 - 23  GND     - GND
24 - 24  GND     - GND
25 - 25  GND     - GND
WHEN (TOGGLE nACK)
    SELECT HIGH
    READ DATA(2-9)
    SELECT LOW
    TOGGLE nSTROBE
L'incrociatura 10 - 1  e' quasi magica, perche' entrambi i segnali TTL
sono normalmente negati.
Inoltre il segnale di nACK, sulla transizione alto-basso, genera una
interruzione sul PC che sta simulando la stampante, consentendo di
implementare la semantica del WHEN in una routine di interruzione.
L'incrociatura di SELECT con BUSY tiene a sua volta conto della
compatibilita' dei segnali.
Richiamo il significato dei bit per la porta non DATA (0x378)
PORTA STATUS 0x379
Bit 7 Busy  <----------- NON utile nell'ascoltatore
Bit 6 Ack   <----------- utile per il polling
Bit 5 Paper Out
Bit 4 Select In
Bit 3 Error
Bit 2 IRQ (Not)
Bit 1 Reserved
Bit 0 Reserved
PORTA CONTROL 0x37A
Bit 7 Unused
Bit 6 Unused
Bit 5 Enable Bi-Directional Port <-------- do it !!
Bit 4 Enable IRQ Via Ack Line    <--------- polling oppure IRQ
Bit 3 Select Printer             <--------- use for setting BUSY to partner
Bit 2 Initialize Printer (Reset)
Bit 1 Auto Linefeed
Bit 0 Strobe                     <--------- use for setting completion
Dato che questa soluzione puo' provocare danneggiamento di hardware
e perdita di dati, consiglio di verificare prima con un oscilloscopio
l'effettivo protocollo usato dal trasmettitore e dalla stampante.
Probabilmente il trasmettirore testa altri segnali per verificare
se la stampante e' pronta. Provare con gli incroci 13-12 16-17
per completare il cavo, con 15 scollegato. Impostare i bit come
risulta opportuno.

 i dati inviati alla stampante e scriverli su un file.
Esistono delle utility che redirezionano su un file l'output verso la
stampante. Cerca su qualche raccolta del genere qui su Internet.
EMG

simulare con un PC DOS il funzionamento della stampante in modo da
acquisire


Penso che la soluzione di Ivan sia la più adatta perchè, forse non ho
chiarito abbastanza questo punto, non posso catturare l'output inviato alla
porta e mandarlo su un file poichè l'elaboratore è un pezzo di ferro con una
tastiera e non è possibile farci alcunchè tranne che lavorare con il
programma inserito; l'unico accesso all'esterno che possiede è una parallela
con cui stampa su una 9 aghi standard. Ecco perchè devo fregarlo e fargli
credere che sta stampando mentre io catturo i dati con un altro computer con
cui elaborerò le informazioni.
Grazie a tutti comunque.
Ivan ti faccio sapere come procedo con il cavo e il software di
acquisizione.