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

 
 
> CodevisionAVR фунция scanf, Как прервать scanf если в порт ничего больше подаваться не будет?
Варяг
сообщение Aug 23 2011, 03:17
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 95
Регистрация: 4-04-11
Из: челябинск
Пользователь №: 64 111



Подскажите, пожалуйста! использую функцию scanf("%s",&string); Потом делаю с этой строкой все что нужно. Но бывает проблема, когда в UART приходит символ "ентер", и мне как бы не надо считывать эту строку, и прервать операцию по превышению TIMEOUT, а scanf ждет, пока в порт придет еще что-нибудь. Хочу сделать, чтобы в прерывании TIM0_OVF если TIMEOUT превышен, то scanf каким-то образом переставала считывать строку.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ReAl
сообщение Aug 23 2011, 05:52
Сообщение #2


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

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



Не про CodeVision-реализацию, а про стандартный scanf со времён K&R:

Пожалуйста, кто-нибудь, переполните мне буфер:
Код
#include <stdio.h>

#define STRINGIFY_(a) #a
#define STRINGIFY(a) STRINGIFY_(a)

#define STR_SIZE 4

char str[STR_SIZE+1];

int main()
{
        do {
                if( !scanf("%" STRINGIFY(STR_SIZE) "s", str) ) break;
                str[STR_SIZE] = 0;
                puts(str);
        } while(str[0] != 'Q');
}

Цитата
real@REALPC:~/temp$ ./ssc
1234567890qwertyuiop[]asdfghjkl
1234
5678
90qw
erty
uiop
[]as
dfgh
jkl
Q
Q
Жирным выделен ввод с клавиатуры.
А то, панимашли, «небезопасен», «переполнение»...

p.s. Для тех, кто не так быстро в голове макросы раскручивает:
формат там "%4s", просто через макрос для синхронной смены вместе с размером буфера.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 24 2011, 04:43
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ReAl @ Aug 23 2011, 09:52) *
Пожалуйста, кто-нибудь, переполните мне буфер:
sm.gif ...оторви мне чего-нибудь, укуси меня за... (с) "Несчастный случай".
Цитата
формат там "%4s"
Ну так жешь нужно вспомнить было про возможность задать ограничение на длину строки, а если тупо "%s", то всегда пожалуйста.

Цитата(ReAl @ Aug 23 2011, 10:56) *
но в типичном применении проблемы переполнения буфера в scanf нет. Есть проблема незнания его форматов ввода.
Согласен. Спасибо за hint!


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Aug 24 2011, 07:02
Сообщение #4


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

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



Цитата(demiurg_spb @ Aug 24 2011, 07:43) *
sm.gif ...оторви мне чего-нибудь, укуси меня за... (с) "Несчастный случай".
«Та нє»™, тут скорее «поднимите мне веки» :-)

Цитата(demiurg_spb @ Aug 24 2011, 07:43) *
Ну так жешь нужно вспомнить было про возможность задать ограничение на длину строки, а если тупо "%s", то всегда пожалуйста.
Да там по вводу строк ещё и ограничить набдор символов можно кроме ширины. Только без s уже:
"%4[0-9]" -- максимум 4 цифры
"%4[^0-9]" -- максимум 4 не-цифры

И ввод символа %c тоже позволяет задать ширину, тогда внутри такого поля '\n' идёт на правах символа, а не разделителя, как для %s
Код
#include <stdio.h>

char str[5];

int main()
{
        str[4] = 0;

        scanf("%4c", str); printf("[%s]\n", str);
        scanf("%4c", str); printf("[%s]\n", str);
        scanf("%4c", str); printf("[%s]\n", str);
}

Цитата
qw
r01234567

[qw
r]
[0123]
[4567]


Вот потому полновесный scanf такой толстый. Умеет много. Не всегда нужного.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Варяг
сообщение Aug 26 2011, 08:38
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 95
Регистрация: 4-04-11
Из: челябинск
Пользователь №: 64 111



Так как я не понял, как прервать функцию scanf, возник вопрос. Есть ли в КОДВИЖНе функция сброса микроконтроллера? хочу его сбрасывать, если в порт так ничего и не приняли.
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 26 2011, 10:45
Сообщение #6


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

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(Варяг @ Aug 26 2011, 12:38) *
Так как я не понял, как прервать функцию scanf, возник вопрос. Есть ли в КОДВИЖНе функция сброса микроконтроллера? хочу его сбрасывать, если в порт так ничего и не приняли.

Фу, как грубо.
Ну а все-таки - читать не scanf-ом, а вручную через регистры не планируете? А когда придется что-то принимать через SPI или I2C - тогда что будете делать?
Go to the top of the page
 
+Quote Post
Варяг
сообщение Aug 26 2011, 10:57
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 95
Регистрация: 4-04-11
Из: челябинск
Пользователь №: 64 111



Цитата(777777 @ Aug 26 2011, 14:45) *
Фу, как грубо.
Ну а все-таки - читать не scanf-ом, а вручную через регистры не планируете? А когда придется что-то принимать через SPI или I2C - тогда что будете делать?


Не грубо, а "сурово". sm.gif ну а если серьезно, то я бы и хотел вручную через регистры все сделать. Но читать через scanf это уже стало моей идеей фикс. Когда придется что-то принимать через SPI или I2C тогда буду думать дальше. а пока устраивает. Контроллер пока не зависает, но хочу обезопасить себя автосбросом по тайм-ауту.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Варяг   CodevisionAVR фунция scanf   Aug 23 2011, 03:17
- - 777777   Цитата(Варяг @ Aug 23 2011, 07:17) Подска...   Aug 23 2011, 04:12
- - demiurg_spb   используйте getchar и сами складывайте символы в с...   Aug 23 2011, 04:56
|- - Варяг   Спасибо, буду править.   Aug 23 2011, 05:35
|- - Варяг   Ну так а все-таки, будь то getchar or scanf, как с...   Aug 23 2011, 06:34
||- - 777777   Цитата(Варяг @ Aug 23 2011, 10:34) Ну так...   Aug 23 2011, 06:54
||- - Варяг   Цитата(777777 @ Aug 23 2011, 10:54) Так г...   Aug 23 2011, 07:30
||- - 777777   Цитата(Варяг @ Aug 23 2011, 11:30) Я чита...   Aug 23 2011, 08:25
- - ReAl   Как в CodeVision -- не подскажу. Но обработку тайм...   Aug 23 2011, 06:56
- - GDI   В CodeVision, по крайней мере в те времена когда я...   Aug 23 2011, 07:31
- - Сергей Борщ   QUOTE (Варяг @ Aug 26 2011, 11:38) Так ка...   Aug 26 2011, 09:35


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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 23:39
Рейтинг@Mail.ru


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