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