реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> scanf + колцевой буфер (WinAVR), результат такого скрещивания неудовлетворительный
ARV
сообщение Jul 20 2010, 06:23
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



вот, решил задействовать функции ввода высокого уровня, а именно scanf.
сделал кольцевой буфер, в который складываются принимаемые по прерываниям из UART байты. создал стандартный поток ввода, как и нужно для реализации WinAVR, функция чтения символа возвращает _FDEV_EOF, если в кольцевом буфере "голова" совпадает с "хвостом", т.е. нет новых данных.

и вот что получается: буфер заполняется довольно медленно, а scanf пытается вычитывать данные быстро, в итоге после вычитывания первого же символа она получает EOF и, естественно, заканчивает ввод... то есть как ни крути, вводится 1 или (редко) два байта, и точка.

почему лыжи не едут?

что-то у меня не очень укладывается в голове, как организовать ввод данных так, чтобы использовать scanf и при этом не попадать в долгие ожидания поступления очередного символа...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
neiver
сообщение Jul 20 2010, 14:11
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123



Можно завести флаг наличия в буффере достаточного количества байт, чтоб их читать с помощью scanf.
Устанавливать его при получении символа разделителя (речь идёт о текстовом вводе/выводе).
Сбрасывать при чтении (если нет других разделителей в буффере).
Функция чтения символа возвращает _FDEV_EOF если этот флаг не установлен - читай в буффере нет разделителей.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 20 2010, 14:52
Сообщение #3


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(ARV @ Jul 20 2010, 09:23) *
что-то у меня не очень укладывается в голове, как организовать ввод данных так, чтобы использовать scanf и при этом не попадать в долгие ожидания поступления очередного символа...
Почти никак.
EOF для scanf означает, что файл закончился, приплыли. Соответственно, он прекращает сканировать и вываливается.
Так что или в getchar ждать до посинения, или в нём же пользоваться сервисом вытесняющей ОС по ожиданию события поступления символа.

Ну или в шаге кооперативки набирать посимвольно в буфер до упомянутого выше разделителя (т.е. "по месту" реализованный gets() с отдачей управления) а потом вызывать sscanf.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
ARV
сообщение Jul 20 2010, 16:46
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



да понятно, что с кооперативкой было бы проще... да перейти на нее трудов стоит. и все извращения в конечном итоге погасят весь выигрыш от scanf... подсчет разделителей, в принципе, немного снизит остроту проблемы, но ведь поиск разделителей - как раз и задача scanf, для этого ее и применять решил... получается, проще входной поток символов разбирать на лету без всяких io-функций...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
klen
сообщение Jul 20 2010, 16:47
Сообщение #5


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



а мож ненада..... scanf использовать - вещ то жутковатя
Go to the top of the page
 
+Quote Post
ARV
сообщение Jul 21 2010, 04:20
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(klen @ Jul 20 2010, 20:47) *
а мож ненада..... scanf использовать - вещ то жутковатя
а в чем жуть? поведение у нее весьма специфическое, это очевидно... но есть еще что-то, скрытое от глаз?


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 21 2010, 07:03
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Я бы так выразился. scanf, как всякая функция "на все случаи жизни", страдает монстроподобностью. Совершенно не очевидно, что именно она вам нужна. Если вы подумаете, выяснится, что нужна реально 1/10 ее функциональности. Посему может проще самому чего написать?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 07:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01387 секунд с 7
ELECTRONIX ©2004-2016