Надо не забыть в биосе включить режим порта ECP,EPP. Даю на всякий случай сорцы(вариант не идеальный но в моем простом случае работает) В коде прием-передача данных по линиям DATA0-3 Упраляющий STROBE.
Код | //baselpt.h /** @author smalcom Class for base operation(read, write data, control, status) with parallel port */
#define PDATA0 0 #define PDATA1 1 #define PDATA2 2 #define PDATA3 3 #define PDATA4 4 #define PDATA5 5 #define PDATA6 6 #define PDATA7 7 #define PSTROBE 0 #define PREAD 5
class CBaseLpt { private: uint baseport; byte data_r, status_r, control_r; public: bool open; void SetData(byte dta); void SetDataPin(byte p, bool val); byte ReadData(); byte ReadStatus(); void SetControlPin(byte p, bool val); void Close(); CBaseLpt(); ~CBaseLpt();
}; /*************************************************/ //baselpt.cpp #include "cbaselpt.h" byte temp; bool checked = false;
CBaseLpt::CBaseLpt() { baseport = 0x378; if(ioperm(baseport, 3, 1)) open = false; else open = true; //setup port outb(0x20, baseport + 2); control_r = 0x20; }
CBaseLpt::~CBaseLpt() { }
void CBaseLpt::SetData(byte dta) { outb(dta, baseport); }
void CBaseLpt::SetDataPin(byte p, bool val) { if(val) outb(inb(baseport) | (0x01 << p), baseport); else outb(inb(baseport) & (0xFF - (0x01 << p)), baseport); }
void CBaseLpt::SetControlPin(byte p, bool val) { if(val) { control_r |= 0x01 << p; outb(control_r, baseport + 2); } else { control_r &= (0xFF - (0x01 << p)); outb(control_r, baseport + 2); }; }
byte CBaseLpt::ReadData() { byte temp;
temp = inb(baseport); return temp; }
byte CBaseLpt::ReadStatus() { return inb(baseport + 1); }
void CBaseLpt::Close() { } /*************************************************/ //clpt.h #include "cbaselpt.h"
#define packlen 5
/** @author smalcom */ class CLPT : public QThread { private: bool setout; byte pout[NUM_OF_OUTPUTS]; bool init; CBaseLpt *m_baselpt; bool write(byte c); bool read(); public: byte *rsbuf; byte *txbuf;
bool Init(); void Close(); bool Poll(); virtual void run();
CLPT(); ~CLPT(); }; /*************************************************/ //clpt.cpp #include "clpt.h" #define STDEL 100
bool run_lock; struct timeval *ttv;
void ultrasleep(uint ultrasec, struct timeval *timeval_temp) { uint tusec, tusec2;
gettimeofday(timeval_temp, NULL); tusec = timeval_temp->tv_usec + ultrasec; tusec2 = timeval_temp->tv_usec; if(tusec >= 999999) { tusec -= 999999; do { gettimeofday(timeval_temp, NULL); }while(timeval_temp->tv_usec >= tusec2); }; do { gettimeofday(timeval_temp, NULL); }while(tusec > timeval_temp->tv_usec); }
CLPT::CLPT() { init = false; run_lock = false; ttv = new struct timeval; }
CLPT::~CLPT() { if(m_baselpt != NULL) { m_baselpt->Close(); delete m_baselpt; }; }
bool CLPT::Init() { m_baselpt = new CBaseLpt; if(!m_baselpt->open) { return false; }; rsbuf = new byte[packlen]; txbuf = new byte[packlen]; return true; }
void CLPT::Close() { if(m_baselpt != NULL) { m_baselpt->Close(); delete m_baselpt; }; init = false; }
bool CLPT::Poll() { start();//здесь запускается тред - функция run return true; }
bool CLPT::write(byte c) { word temp;
m_baselpt->SetControlPin(PREAD, false); //setup packet for write txbuf[0] = 0xAB; txbuf[1] = c; txbuf[4] = txbuf[1] + txbuf[2] + txbuf[3]; for(uint bc = 0; bc < packlen; bc++) { temp = txbuf[bc]; m_baselpt->SetData((temp & 0x0F) | 0x10); m_baselpt->SetControlPin(PSTROBE, true); ultrasleep(STDEL, ttv); m_baselpt->SetControlPin(PSTROBE, false); ultrasleep(STDEL, ttv);
m_baselpt->SetData((temp >> 4) & 0x0F); m_baselpt->SetControlPin(PSTROBE, true); ultrasleep(STDEL, ttv); m_baselpt->SetControlPin(PSTROBE, false); ultrasleep(STDEL, ttv); }; m_baselpt->SetControlPin(PREAD, true); return true; }
bool CLPT::read() { word temp;
for(uint bc = 0; bc < packlen; bc++) { m_baselpt->SetControlPin(PSTROBE, true); ultrasleep(STDEL, ttv); rsbuf[bc] = m_baselpt->ReadData() & 0x0F; m_baselpt->SetControlPin(PSTROBE, false); ultrasleep(STDEL, ttv);
m_baselpt->SetControlPin(PSTROBE, true); ultrasleep(STDEL, ttv); rsbuf[bc] += ((m_baselpt->ReadData() & 0x0F) << 4); m_baselpt->SetControlPin(PSTROBE, false); ultrasleep(STDEL, ttv); }; temp = rsbuf[1] + rsbuf[2] + rsbuf[3]; if(temp == rsbuf[4]) return true; else return false; }
void CLPT::run() {
if(!init) { txbuf[2] = 0x00; txbuf[3] = 0x00; write(CMD_INIT); //read answer if(read()) { init = true; goto run_end; }; } else { txbuf[2] = 0x00; txbuf[3] = 0x00; write(CMD_POLL); if(read()) { txbuf[3] = 0x00; write(CMD_ACK); }; }; return; }
|
|