funkcijom open() otvaras fajl; on vraca int koji predstavlja file descriptor ili kako je
autor ovog koda to skraceno nazvao promenljivu fd;funkcija close ti zatvara fajl,
njoj dajes file descriptor koji treba da zatvori :close(fd);Takodje ako open() ne uspe da otvori fajl vraca -1;E sad otvoriti fajl u jednoj aplikaciji a onda ga zatvoriti u drugoj prvo pitanje je a zasto bi to radio?sve sto treba da se uradi uradi u jednoj aplikaciji, otvori fajl, zatim radi sta vec hoces sa njim-> u tvom slucaju iscitivaj podatke onoliko puta koliko ti je potrebno , a kad zavrsis zatvori fajl i izadji iz aplikacije.
evo ti izmenjena main() funkcija ostatak ti je isti:
Code:
/*------SVE IZNAD MAIN() je isto ------------------------------------------*/
int main(int argc,char **argv)
{
unsigned char data;
unsigned char buffer[100];
unsigned char buffer1[9];
char units[20];
int n;
float it;
unsigned int t,tf;
fd=open_serial("/dev/ttyS0", 2400);
set_rts_dtr(fd); // DTR/RTS setzen
t=get_time(NULL);
while(1)
{
n=0;
memset(buffer,0,20);
while(1)
{
read(fd,&buffer[n],1);
if ((buffer[n]&0xf0)==0xe0 || (n==16))
break;
n++;
}
#if 0
// Raw output
for(n=0;n<16;n++)
printf("%02x ",buffer[n]);
#endif
buffer1[0]=buffer[0]&15;
for(n=0;n<8;n++)
buffer1[1+n]=((buffer[2*n+1]&15)<<4)|(buffer[2*n+2]&15);
#if 0
// Nibble compacted data
for(n=0;n<8;n++)
printf("%02x ",buffer1[n]);
printf("%i%i%i%i\n",digit(buffer1[1]),digit(buffer1[2]),
digit(buffer1[3]),digit(buffer1[4]));
#endif
if ((buffer1[3]&0x7f)==0x68)
it=9999999;
else
it=1000.0*digit(buffer1[1])+100.0*digit(buffer1[2])
+10*digit(buffer1[3])+1*digit(buffer1[4]);
if (buffer1[4]&0x80)
it=it/10.0;
if (buffer1[3]&0x80)
it=it/100.0;
if (buffer1[2]&0x80)
it=it/1000.0;
if (buffer1[1]&0x80)
it=-it;
tf=(int)((get_time(NULL)-t)/100000.0);
dvm_unit(buffer1[0], (buffer1[5]<<16)|(buffer1[6]<<8)|buffer1[7],units);
printf("%0.1f %0.3f %s\n",tf/10.0,it, units);
fflush(stdout);
/*-----izmena*/
if(getc(stdin)!=10)
{
break;
}
/*--------*/
}
/*-----izmena*/
close(fd);
/*--------*/
}
UPUSTVO ZA UPOTREBU:
dakle ovo radi malo drugacije, u momentu kada hoces da procitas trenutno stanje ti pretisni ENTER, i izbaci ce ti trenutno stanje, onda ako opet hoces da ti procita opet ENTER i on ti opet izbaci trenutno stanje, ne radi kao u predhodnom slucaju elegantno i automatski ali sto oces vise za 5 minuta razmisljanja i dva reda koda.
KADA SI ZAVRSIO I HOCES DA IZADJES (VEOMA VAZNO):
pritisni bilo koje slovo na tastaturi i zatim ENTER i program ce prvo da zatvori seriski i zatim da se zatvori. ako ga ovako ne zatvoris desi ce ti se isto kao u predhodnom slucaju.
dakle ako zelis da procitas ternutno stanje samo ENTER, a kad si zavrsio neko slovo i ENTER
ovo 100% radi u VC++ za ostalo ti ne garantujem, mozda ces morati da dodas jos neki heder.