Здравствуйте.Прошу направить на путь истинный.
Необходимо читать данные с последовательного порта, ловить в потоке сообщения в определенном протоколе и обрабатывать эти сообщения. Обработка достаточно сложная и может занимать много времени.
Как не потерять входные данные за время обработки или хотя бы сигнализировать о том что мы не успеваем обрабатывать поток? Куда уходят байты из открытого файла если их не читать вызовами read, fread и прочими? Где какие есть буфера? Какой вообще путь проходят байты от UARTа до переменной в памяти программы?
Ну и главный вопрос, где обо всей этой кухне почитать?Есть подозрение, что все относительно просто и опасение, что все очень просто. В этом случае, прошу отнестись к вопросам снисходительно.
Заранее спасибо.
>[оверквотинг удален]Пишешь конечно на Алголе 68 под Oberon OS ?
http://www.tldp.org/HOWTO/Serial-Programming-HOWTO/
http://www.easysw.com/~mike/serial/serial.html
Ну, близко. На Си под Linux. А Serial HOWTO читал неоднократно. Не помогло.
> Не помогло.Не помогло где, показывай кусок кода, где не работает?!
Не помогло понять физику процесса. В частности, куда деваются байты если их не читать. Или читать, но недостаточно быстро.
Вот так, например. Будут байты из потока выхватываться те что в текущий момент там идут или по порядку, накапливаясь в каком-то буфере ОС?while (1) {
res = fgetc(fp);
sleep(1);
}
> накапливаясь в каком-то буфере ОС?Ага, виртуальная память называется.
> while (1) {
> res = fgetc(fp);
> sleep(1);
> }Тут ничего не накапливается. (ну разве только TSC)
Об виртуальной памяти я и не подумал.
А извлекаться байты будут, видимо, в том порядке, в котором приходили.
Ничего не потеряется, так да?
> Об виртуальной памяти я и не подумал.
> А извлекаться байты будут, видимо, в том порядке, в котором приходили.
> Ничего не потеряется, так да?Байты сладываются в FIFO-буфер UART, размер которого обычно 16 байт.
Отсюда делайте вывод, сколько поместится и как долго будет там храниться.
> Об виртуальной памяти я и не подумал.
> А извлекаться байты будут, видимо, в том порядке, в котором приходили.
> Ничего не потеряется, так да?Отец, как бы тя не обидеть, но ты ..., в общем начни
отсюда - http://www.sernam.ru/book_tec.php
потом сюда - http://www.kodges.ru/68824-osnovy-cifrovoj-texniki.html
потом тут - http://sdo.uspi.ru/mathem&inform/lek_10/lek_10.htm
тут - http://amigaroy.narod.ru/dmit.html и тут http://imcs.dvgu.ru/lib/eastprog/architecture.html
потом - http://www.proklondike.com/books/thalg/kormen_leiser_algorit...
Наконец сюда - http://lib.ru/CTOTOR/kernigan.txtМожно сразу сюда, но легче не станет - http://lib.ru/CTOTOR/starterkit.txt
Ну и сюда http://www.proklondike.com/books/linux/linux_syst_prog.html
Ваше желание мя обидет мне понятно. Спасибо, что таки себя побороли. Книжки хорошие. Я их читал даже. Но в них не написано то о чем я спрашивал. Признаться, думал ldd посоветуете или что-то такое. Блин, неужто и вправду такой тупой вопрос, что прям про 16 байт в уарте напоминают.
> Ваше желание мя обидет мне понятно. Спасибо, что таки себя побороли. Книжки
> хорошие. Я их читал даже. Но в них не написано то
> о чем я спрашивал. Признаться, думал ldd посоветуете или что-то такое.
> Блин, неужто и вправду такой тупой вопрос, что прям про 16
> байт в уарте напоминают.байты теряются, если их не читать - это как бы очевидно.
грубо, когда ты вызываешь read(), дергается функция из line discipline - tty layer. Которая читает из своего буфера - порядка 256 байт, хотя см флаг tty read latency. этот буфер наполняется драйвером уарта - serial.c , когда приходит соотв. прерывание.
как-то так .
не хочешь терять данные - наворачивай протокол с подтверждениями
> не хочешь терять данные - наворачивай протокол с подтверждениямиTCP/IP :)