Zpozdeni na seriovem portu 16550A

Igor Bujna igor.bujna na maxi-tip.cz
Úterý Srpen 19 17:32:10 CEST 2003


Jan Kasprzak wrote:

>	Dobry den,
>
>mam zarizeni pripojene pres seriovy port (16550A), se kterym mi jest
>komunikovati. Komunikace vypada tak, ze zarizeni posila urcite skupiny
>bajtu (porad dokola) a kdyz chce neco pocitac, tak po skupine jistych ctyr
>bajtu muze zacit vysilat. Problem je, ze mi to nefunguje (zarizeni se tvari,
>jakoby od PC nic nedostalo). Zjistil jsem, ze zrejme je problem
>v seriovem portu, ze se nekde neco bufferuje: pokud ve sve testovaci
>aplikaci nejdriv zavolam
>
>	system("setserial /dev/ttyS0 uart 16450");
>
>tak to zacne fungovat. Pokud si pres gettimeofday() zjistuji, jak dlouho
>trva nacteni konkretnich bajtu, tak s 16450 to vypada tak, ze bajty
>prichazeji cca po 1ms (coz odpovida rychlosti 9600 bps) a v okamziku
>kdy mam vysilat, je cca 20ms pauza. Zatimco pokud pres setserial
>nastavim uart 16550A, tak prvni bajt prijde az treba po 10-20ms a dalsich
>7 bajtu prijde po 9-11 mikrosekundach (cili jsou zrejme nekde nabufferovane).
>Tim se asi pak stane, ze v okamziku, kdy se ke me dostane ten prislusny
>blok dat, tak uz je pozde vysilat z me strany, protoze zarizeni uz zase
>vysila dal.
>
>	Zkousel jsem udelat "dirty trick", kdy po precteni prvnich tri
>ze ctyr bajtu te synchronizacni sekvence zacnu natvrdo vysilat, a to
>obcas projde i s 16550A. Ale je to nesystemove.
>  
>
Nebude to nahodou tim, ze FIFO pouziva buffer?? viz 
http://www.ibiblio.org/mdw/HOWTO/Serial-HOWTO.html
Mozna zkuste toto:
----------------------------------------------------------------------
Reading Data from the Port

Reading data from a port is a little trickier. When you operate the port 
in raw data mode, each/ read(2)/ system call will return however many 
characters are actually available in the serial input buffers. If no 
characters are available, the call will block (wait) until characters 
come in, an interval timer expires, or an error occurs. The/ read/ 
function can be made to return immediately by doing the following:

    fcntl(fd, F_SETFL, FNDELAY);

The/ FNDELAY/ option causes the/ read/ function to return 0 if no 
characters are available on the port. To restore normal (blocking) 
behavior, call/ fcntl()/ without the/ FNDELAY/ option:

    fcntl(fd, F_SETFL, 0);

This is also used after opening a serial port with the O_NDELAY option.
----------------------------------------------------------------------------
Jinak dobre poctenicko jak programovat seriovy port roste v teto 
zahradce http://www.easysw.com/~mike/serial/serial.html


>	Vite nekdo, jak v Linuxu vypnout FIFO na 16550A (nebo aspon
>jak dosahnout toho, aby kdyz UART dostane nejaky bajt a nekdo na ten
>bajt ceka (volam read(fd, buffer, 1), cili cekam jen na ten jeden bajt),
>tak aby proste UART (nebo driver) ten bajt ihned predal?
>
>	Tenhle problem jsem uz nekde videl, ale nemuzu se nejak
>dogooglit jak se to presne resilo.
>
>  
>




Další informace o konferenci Linux