Odosielanie znaku z PC1 na PC2 cez RS232 a vytlacenie v C
Napsal: ned 5. črc 2009, 13:11
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:
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
}