Odosielanie znaku z PC1 na PC2 cez RS232 a vytlacenie v C

Vývojová prostředí, aplikace, skripty, http://www... síťové programy, internet, sdílení...
Odpovědět
oqix
Začátečník
Začátečník
Registrován: 28. dub 2005
Bydliště: Prešov, Slovakia /Brno, Czech rep.
Kontaktovat uživatele:

Odosielanie znaku z PC1 na PC2 cez RS232 a vytlacenie v C

Příspěvek od oqix »

Nazdar,
mam taky maly problem. Pokusam sa rozchodit posielanie znaku z PC1 na PC2 cez RS232 a ten nasledne vytlacit na tlaciarni. Podmienkou toho je spravit to ccez prerusenia od tlaciarne.
Znak prenesiem bez problemov ale tlacit mi to nechce. Nevedel by niekto poradit? Dik. OSpravedlnujem sa za dlhy post ale chcel som to tu dat cele naraz.
Tu je zdroj:

Kód: Vybrat vše

#include<conio.h>
#include<stdio.h>
#include<dos.h>
#include <stdlib.h>


#define PRISLO ( inportb(baza+5)& 1 ) //makro pre prijem zo ser. linky

int baza = 0x3f8;                     //bazova adresa portu COM1


/*-----------Funkcia pre inicializaciu ser. portu------------*/

void inic_sport(void)
{
        
   outportb(baza+3,0x80);  // DLAB=1 
   outportb(baza,0x0C);    // dolny byte delitela hodin, prenosova rychlost 9600 Bd = 12
   outportb(baza+1,0);     // horny byte delitela hodin 
   outportb(baza+3,0x03);  // 8 datovych bitov, 1 stop bit, bez parity, DLAB = 0 
}


union REGS r; 			//sluzi na vymenu dat z a do funkcii int86, int86x

/*---------------- Funkcia pre inicializaciu tlaciarne ----------------*/

void init(void)
{
  r.h.ah=1; 			//sluzba inicializuj port tlaciarne
  r.x.dx=0; 			//DX - cislo tlaciarne
  int86(0x17,&r,&r); 		//vykonanie prerusenia od tlaciarne
				//skopiruje hodnotu z inregs do registrov
}

/*------------ Funkcia pre zistenie stavu tlaciarne -----------*/

int stav_tlac(void)     	//zistenie stavu tlaciarne
{
  r.h.ah=2; 			//sluzba vrat stav tlaciarne
  r.x.dx=0; 			//DX - cislo tlaciarne
  int86(0x17,&r,&r);
  return(r.h.ah);      		//stav bude v AH
}


/*----- Funkcia pre vytlacenie znaku na tlaciarni s vyuzitim BIOSU -----*/

void vysli(int c)
{
  r.h.al=c; 			//AL - ASCII znak na vytlacenie
  r.h.ah=0; 			//sluzba tlacenia znaku
  r.x.dx=0; 			//DX - Cislo tlaciarne
  int86(0x17,&r,&r);
}


/*------------- Funkcia pre vytlacenie znaku na tlaciarni --------------*/

void tlac_ret(char prijmi)
{
  int stav;

  stav=stav_tlac();     		//zisti stav tlaciarne
  while(prijmi!=0)      			//ak je prijaty znak
    if((stav=stav_tlac())&0x20)    	//ak dosiel papier
    {
      printf("Dosiel papier, cakam nan !\n");
      while(stav_tlac()&0x20)     	//cakaj na vlozenie papiera
 if(kbhit())     			//ak je stlacena klavesa, skonci
 {
   getch();
   exit(1);
 }
    }
    else       				//ak je vsetko O.K.
    {
      delay(50);
      vysli(prijmi);      		//vytlac postupne znaky retazca
    }
}


/*----------------------Hlavny program-----------------------*/

void main()
{
    int stav;
    unsigned char prijmi;
    clrscr();
    inic_sport();                    // inicializacia serioveho portu



  clrscr();
  init();			//inicializuj tlaciaren
  stav=stav_tlac();    		//zisti stav tlaciarne a vypise prislusnu chybovu spravu


    do
      {
    	if ( PRISLO )                // cakame kym nepride znak
          {
	    prijmi = inportb(baza);  //vyber znaku z BUFFERA
	    printf("%c",prijmi);     //zobrazenie prijateho znaku na obrazovku
          }
     
  if(stav&0x40)
  {
    printf("\nTlaciaren nepripojena !\n");
    exit(1);
  }
  if(stav&0x01)
  {
    printf("\nTime out");
    exit(1);
  }
  if(stav&0x08)
  {
    printf("\nChyba I/O");
    exit(1);
  }
  if(stav&0x20)
  {
    printf("\nTlaciaren nema papier");
    exit(1);
  }

  tlac_ret(prijmi); 
  }while(prijmi != 0x1b);           // Ukoncenie programu ak vysielac vysle ESC

}
Odpovědět

Zpět na „Programování a web“