RS


nadajnik:
#include "u:\serial\codes.h"
#include
#include
#include

#define MAX 1024
#define MAX2 512

//const odb = 0x3F8;
const com2 = 1;

char buf[MAX];//bufor znaków do wysłania po zakodowaniu
char buf2[MAX2];// bufor znaków

void initport(unsigned char portnr)//inicjalizacja portu
{
union REGS regs;
unsigned char code=0xc2;

regs.h.dh = 0;
regs.h.dl = portnr;
regs.h.ah = 0;
regs.h.al = code;
int86(0x14, ®s, ®s);
}

void sendchar(char c) //wysłanie znaku
{
asm{
mov ah,1
mov dx,com2
mov al,c
int 0x14
}
}

char rechar()//odebranie znaku
{
asm{
mov ah,2
mov dx,com2
int 0x14
}
}


int init()// inicjalizacja transmisji
{
sendchar(EOT);
sendchar(0);
sendchar(100);
sendchar(ENQ);
if(rechar()==ACK)
return 1;
return 0;
}

void koduj(char *we,char *wy,int ile)//kodowanie danych z we do wy
{ int i,j=0;
char znak;
for(i=0;i {
znak=we[i] ;
wy[j++]=znak | 0xf0;
znak=(we[i]>>4);
znak|=0xf0;
wy[j++]=znak;
}
}
char xor(char* buf,int rozmiar)// liczenie sumy kontrolnej
{
char sum=0;
int i=0;
for(sum=0; i sum&=0x7f;
return sum;
}



main(int argc, char **argv)
{
FILE *plik;
int i = 0,ilosc,i_p;
if (argc<2)
{
printf("Brak argumentu\n");
return -1;
}
if ((plik=fopen(argv[1],"rb"))==NULL)
{
printf("Nie ma pliku %s\n",argv[1]);
return -1;
}
initport(com2);
while(init() == 0)//inicjuj transmisję
if(i++==3)
return -1;
printf("OK\n");
sendchar(SOH);
koduj(argv[1],buf,strlen(argv[1])+1);//koduj nazwę pliku- nagłówek
for(i = 0; i <= strlen(argv[1])*2; i++)//wysłanie nagłówka
sendchar(buf[i]);
sendchar(STX);

while((ilosc = fread(buf2,1,MAX2,plik)) != 0)// kolejne bloki
{
printf("Ilosc : %d\n",ilosc);
koduj(buf2,buf,ilosc);
i_p = 0;
while(1){
for(i = 0;i < 2*ilosc;i++)
sendchar(buf[i]);
if(ilosc == MAX2)
sendchar(ETB);
else
sendchar(ETX);
sendchar(xor(buf2,ilosc));
if(rechar() == ACK)//transmisja pomyślna-następny blok
break;
if(i_p++ == 3)//ponów wysłanie bloku (3 razy)
{
printf("Blad transmisji 3 danych\n");
return -1;
}
}
}

fclose(plik);
}



odbiornik:


#include "u:\serial\codes.h"
#include
#include

#define MAX 1024
#define MAX2 512

const com1 = 0;

char buf[MAX];
char buf2[MAX2];
char n_p[13];

void initport(unsigned char portnr)
{
union REGS regs;
unsigned char code=0xc2;

regs.h.dh = 0;
regs.h.dl = portnr;
regs.h.ah = 0;
regs.h.al = code;
int86(0x14, ®s, ®s);
}

void sendchar(char c)
{
asm{
mov ah,1
mov dx,com1
mov al,c
int 0x14
}
}

char rechar()
{
char c;
asm{
mov ah,2
mov dx,com1
int 0x14
mov c,al
}
return c;
}


int init()
{
char c;
int a;

while(rechar()!=EOT);

a = rechar();
a = rechar() | (a<<8);
if(a!=100)
{
sendchar(NAK);
return 0;
}

c = rechar();
return (c==ENQ);
}


void dekoduj(char *we,char *wy,int ile)// dekodowanie danych
{ int i,j;
char znak,znak2;
j=0;
for (i=0;i {
znak=we[i];
znak=znak & 0x0f;
znak2=(we[i+1]<<4);
znak2+=znak;
wy[j]=znak2;
j++;
}
}



char xor(char* buf,int rozmiar)
{
char sum=0;
int i=0;
for(sum=0; i sum&=0x7f;
return sum;
}


main()
{
int i = 0;
char c,LRC,licz;
FILE *plik;
initport(com1);

while(init() == 0)
if(i++==3)
return -1;
printf("Wys ACK\n");
sendchar(ACK);
i = 0;
if(rechar()== SOH)
while((buf[i] = rechar()) != STX)
i++;
dekoduj(buf,n_p,i);
printf("PLIK: %s\n", n_p);
if ((plik=fopen("temp.$$$","wb"))==NULL)
{
printf("Nie ma pliku temp\n");
return -1;
}
licz = 0;
while(1)
{
i = 0;
while(1)
{
c = rechar();
if(c == ETB || c == ETX)
break;
buf[i++] = c;
}
dekoduj(buf,buf2,i);
LRC = rechar();
if(xor(buf2,i/2) != LRC)
{
sendchar(NAK);
if(licz++ == 3)
return -1;
continue;
}
else
licz = 0;
fwrite(buf2,1,i/2,plik);
sendchar(ACK);
if(c == ETX)
break;
}
fclose(plik);
return 0;
}





plik nagłówkowy zawierający definicję wartości znaków sterujących:


#ifndef codesH
#define codesH

const char SOH=1;
const char STX=0x02;
const char ETX=0x03;
const char EOT=0x04;
const char ENQ=0x05;
const char ACK=0x06;
const char DLE=0x10;
const char NAK=0x15;
const char SYN=0x16;
const char ETB=0x17;



#endif


Wyszukiwarka

Podobne podstrony:
IE RS lab 9 overview
rs 8 xldrpzq4mtlta5ni3adzmzeccszesj4zohnxomq
rs 55 ohfxzg6gg6vi5jdr7xinhlfwd7syhtcvrhowary
rs 11a w32mj6ipvxqvudbg6ixjbpjbbl5tgcsxvdb3pfy
rs 19a vewogqk3kwskjmpo2eulnzpq26akn7n2wr5axoq
rs 16a 7gvce6q6qml7lpaea4w3t3sfre66uwab6ku2xxq
rs 80a lrheykel6rb4qu4qgeo7kwkbbwknxypre7o76xq
rs 71a o45qlf3an7row52lxuldvqiijopoctqsyueuyzi
rs 1a 2tfi2c2pbaf5unykch73naxcmde52hs5fxgcsia
rs 14a 3odchcxhpayrqf5ltxoopubmwioou4j3dv65bxq
rs 61a hd62ufq26zxuiw24ngl3tohs6kx43ziu5idp7ia
rs 3 lxs74dlalqw5cqrfbvztxnum2nsvj4x3q5jkf3i
IE RS lab 19 overview
rs 10 c24yywxd6w5jnczu3bcqec36qdqlxz2qci7niha
rs 7 evs3vao2rqugyk7znmr7sssuzdy5zqgkmkergsi

więcej podobnych podstron