cteni ze serioveho portu, nekdy jo a nekdy blbe
bravenec na optimit.cz
bravenec na optimit.cz
Středa Duben 7 07:36:33 CEST 1999
>
> - kdyz mi po drate prijde 2048 B dlouha message, tak ja ji budu nacitat v
> cyklu po 16 B ?? to mi prijde jako hodne nehospodarne co se tyce casu
> procesoru a jeho zateze.
>
> - jak mam cist min casto, ja to potrebuju nacist najednou, vzdyt nevim
> kdy mi prijde dalsi SIGIO a dalsi data !!!
>
Ach takto!
Ale to je hluboke, hluboke nedorozumneni!
Kernel nijak nepozna, ze zprava, ktera prichazi ze serioveho portu, je
dlouha
2 KB. Kernelu je to jedno. V momente, kdy se snazite cist data, kernel
vam
podstrci, co zrovna ma k dispozici. Pokud nema nic, ani vam nic neda.
Coz muze byt ten pripad, kdy jste neco precetl dvakrat. Proste jste
predpokladal,
ze ctete 2 KB, neoveril jste to, nic se neprecetlo a ve vnitrnim bafru
vaseho
programu zbyla data z predchazejiciho cteni.
Jak jsem zminoval drive, ctu v kteremsi ze svych programu proud dat asi
po
pul kilobajtovych kusech. Nekdy prectu 400B, nekdy 600, nekdy 1700,
nekdy nic a
nekdy to nestihnu... ale prumer je tak pul kilobajtu. Uvest tahle data
do spravnych
souvislosti musi muj program.
Pro cteni dvou kilobajtu muze pouzit treba toto:
static int ReadDevice (int fd, unsigned char *b, int len) {
int y, x=0;
while (x != len) {
do {
y=read(fd,&b[x],len-x);
if (y<0) fprintf (stderr, "Chyba pri cteni: %s\n",
strerror(errno));
} while (y<0);
x+=y;
}
return x;
}
Petr Bravenec
Další informace o konferenci Linux