URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9575
[ Назад ]

Исходное сообщение
"Обработка потока с последовательного порта"

Отправлено pretender424 , 09-Ноя-12 18:57 
Здравствуйте.

Прошу направить на путь истинный.
Необходимо читать данные с последовательного порта, ловить в потоке сообщения в определенном протоколе и обрабатывать эти сообщения. Обработка достаточно сложная и может занимать много времени.
Как не потерять входные данные за время обработки или хотя бы сигнализировать о том что мы не успеваем обрабатывать поток? Куда уходят байты из открытого файла если их не читать вызовами read, fread и прочими? Где какие есть буфера? Какой вообще путь проходят байты от UARTа до переменной в памяти программы?
Ну и главный вопрос, где обо всей этой кухне почитать?

Есть подозрение, что все относительно просто и опасение, что все очень просто. В этом случае, прошу отнестись к вопросам снисходительно.

Заранее спасибо.


Содержание

Сообщения в этом обсуждении
"Обработка потока с последовательного порта"
Отправлено pavlinux , 10-Ноя-12 02:45 
>[оверквотинг удален]

Пишешь конечно на Алголе 68 под Oberon OS ?  

http://www.tldp.org/HOWTO/Serial-Programming-HOWTO/
http://www.easysw.com/~mike/serial/serial.html


"Обработка потока с последовательного порта"
Отправлено pretender424 , 10-Ноя-12 02:49 
Ну, близко. На Си под Linux. А Serial HOWTO читал неоднократно. Не помогло.


"Обработка потока с последовательного порта"
Отправлено pavlinux , 10-Ноя-12 02:58 
> Не помогло.

Не помогло где, показывай кусок кода, где не работает?!



"Обработка потока с последовательного порта"
Отправлено pretender424 , 10-Ноя-12 03:17 
Не помогло понять физику процесса. В частности, куда деваются байты если их не читать. Или читать, но недостаточно быстро.


"Обработка потока с последовательного порта"
Отправлено pretender424 , 10-Ноя-12 03:26 
Вот так, например. Будут байты из потока выхватываться те что в текущий момент там идут или по порядку, накапливаясь в каком-то буфере ОС?

while (1) {
    res = fgetc(fp);
    sleep(1);
}


"Обработка потока с последовательного порта"
Отправлено pavlinux , 10-Ноя-12 20:25 
> накапливаясь в каком-то буфере ОС?

Ага, виртуальная память называется.

> while (1) {
>     res = fgetc(fp);
>     sleep(1);
> }

Тут ничего не накапливается. (ну разве только TSC)


"Обработка потока с последовательного порта"
Отправлено pretender424 , 10-Ноя-12 20:54 
Об виртуальной памяти я и не подумал.
А извлекаться байты будут, видимо, в том порядке, в котором приходили.
Ничего не потеряется, так да?

"Обработка потока с последовательного порта"
Отправлено Mimicus Pipicus Onanizmus , 12-Ноя-12 09:04 
> Об виртуальной памяти я и не подумал.
> А извлекаться байты будут, видимо, в том порядке, в котором приходили.
> Ничего не потеряется, так да?

Байты сладываются в FIFO-буфер UART, размер которого обычно 16 байт.
Отсюда делайте вывод, сколько поместится и как долго будет там храниться.


"Обработка потока с последовательного порта"
Отправлено pavlinux , 12-Ноя-12 22:26 
> Об виртуальной памяти я и не подумал.
> А извлекаться байты будут, видимо, в том порядке, в котором приходили.
> Ничего не потеряется, так да?

Отец, как бы тя не обидеть, но ты ...,  в общем начни
отсюда -  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


"Обработка потока с последовательного порта"
Отправлено pretender424 , 13-Ноя-12 02:50 
Ваше желание мя обидет мне понятно. Спасибо, что таки себя побороли. Книжки хорошие. Я их читал даже. Но в них не написано то о чем я спрашивал. Признаться, думал ldd посоветуете или что-то такое. Блин, неужто и вправду такой тупой вопрос, что прям про 16 байт в уарте напоминают.



"Обработка потока с последовательного порта"
Отправлено Alex_S , 21-Ноя-12 09:11 
> Ваше желание мя обидет мне понятно. Спасибо, что таки себя побороли. Книжки
> хорошие. Я их читал даже. Но в них не написано то
> о чем я спрашивал. Признаться, думал ldd посоветуете или что-то такое.
> Блин, неужто и вправду такой тупой вопрос, что прям про 16
> байт в уарте напоминают.

байты теряются, если их не читать - это как бы очевидно.

грубо, когда ты вызываешь read(), дергается функция из line discipline - tty layer. Которая читает из своего буфера - порядка 256 байт, хотя см флаг  tty read latency. этот буфер наполняется драйвером уарта - serial.c , когда приходит соотв. прерывание.

как-то так .


"Обработка потока с последовательного порта"
Отправлено Alex_S , 21-Ноя-12 09:13 

не хочешь терять данные - наворачивай протокол с подтверждениями



"Обработка потока с последовательного порта"
Отправлено pavlinux , 22-Ноя-12 01:02 
>  не хочешь терять данные - наворачивай протокол с подтверждениями

TCP/IP :)