Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: stm32f103c8 scanf+printf UART IAR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
FAE
дравствуйте!
Может быть кто-то сталкивался с проблемами при перенаправлении printf и scanf на UART?
Я использую китайскую плату с MC stm32F103. Для программирования использую
IAR 7.40 и библиотеку HAL из stm32cubef1 (STM32Cube_FW_F1_V1.2.0)

Задача - перенаправить стандартный ввод-вывод на UART.
Задачу я решил, даже двумя способами, но у каждого способа оказались свои недостатки.
Буду рад, если найдутся желающие посмотреть мой нехитрый код и объяснить мне, как его исправить.

В программе с помощью макроса EXTTTY можно настроить три варианта ввода/вывода:
EXTTTY 0 - ввод/вывод в I/O Terminal оболочки IAR
EXTTTY 1 - ввод/вывод через UART посредством переопределения функций fputc и fgetc
EXTTTY 2 - ввод/вывод через UART посредством переопределения функций __write и __read и написания MyLowLevelPutchar и MyLowLevelGetchar

Проблемы при EXTTTY 1 - scanf с шаблоном "%d" "проглатывает" первый символ. (Вводишь 123, воспринимается как 23)
Проблемы при EXTTTY 2 Все раюотает примерно 2 минуты, а затем в терминал начинают сыпаться какие-то левые символы (может, вотчдог срабатывает?)

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

Заранее благодарю откликнувшихся )

Прикрепленные файлы
Прикрепленный файл myprintf.zip ( 104.18 килобайт ) Кол-во скачиваний: 0
SasaVitebsk
Я просто переписываю putc, getc да и всё. При этом можно перенапривить куда угодно. Например на LCD.
mantech
Цитата(SasaVitebsk @ Nov 24 2015, 17:07) *
Я просто переписываю putc, getc да и всё. При этом можно перенапривить куда угодно. Например на LCD.


А координаты вывода как передаете?
Tarbal
Цитата(mantech @ Nov 24 2015, 20:11) *
А координаты вывода как передаете?


Текста? Туда где курсор, а курсор всегда сдвигается на длину написанного вправо или вниз и начало строки если строка закончилась.
Можно (если ее нет) сделать функцию для установки позиции курсора.
mantech
Цитата(Tarbal @ Nov 24 2015, 20:49) *
Текста? Туда где курсор, а курсор всегда сдвигается на длину написанного вправо или вниз и начало строки если строка закончилась.
Можно (если ее нет) сделать функцию для установки позиции курсора.


Функция не совсем удобно, у себя слегка поправил парсер, чтоб можно было задавать %XN=... %YN=...
Сорри за офтоп rolleyes.gif
SasaVitebsk
Цитата(mantech @ Nov 24 2015, 21:11) *
Функция не совсем удобно, у себя слегка поправил парсер, чтоб можно было задавать %XN=... %YN=...
Сорри за офтоп rolleyes.gif

И что мешает? Я так и делал...
FAE
Цитата(SasaVitebsk @ Nov 24 2015, 17:07) *
Я просто переписываю putc, getc да и всё. При этом можно перенапривить куда угодно. Например на LCD.


А вы пользуетесь компилятором IAR?
У меня возникает ошибка, что эти функции уже определены.
А вот fputc и fgets переопределяются нормально
Aleksandr Baranov
Цитата(FAE @ Nov 25 2015, 07:53) *
А вы пользуетесь компилятором IAR?
У меня возникает ошибка, что эти функции уже определены.
А вот fputc и fgets переопределяются нормально

Я пользуюсь IAR, и определяю putchar.
hiranyakashipu
Попробуйте без HAL, через регистры, инициализировать UART и сделать fputc, fgetc.
Вот в этой теме, например, говорится о проблемах в HAL при передаче по UART:
http://electronix.ru/forum/index.php?showt...131520&st=0
SasaVitebsk
Да пользуюсь IAR. Прошу прощения, действительно putchar.
В принципе в библиотеке описано
Вот примерно лет 10 назад )) для 44780 учебный проект какой-то ...
CODE

int16_t putchar(int16_t c_in) // Вывести символ в кодировке Win. с управляющими символами
{
uint8_t c;
uint8_t static cr_direct_flag; // Флаг прямой адресации курсора

c = c_in; // Привести к байту
if(cr_direct_flag==1){
cr_direct_flag=0; // Сбросить
GotoXY(c & 0x1f,c>>5); // Выполнить прямую адресацию курсора
}
else{
if((c>=8) && (c<0x20)){
switch©{
case CR_TAB:
WaitEndData(' '); // вывести ' '
WaitEndData(' '); // вывести ' '
WaitEndData(' '); // вывести ' '
WaitEndData(' '); // вывести ' '
break;
case CR_LEFT:
cr_left();
case CR_RIGHT:
cr_right();
break;
case CR_BS:
if(cr_left()>=0){
WaitEndData(' '); // вывести ' '
cr_left();
}
break;
case CR_CURSHOW:
CURSHOW; // Курсор показать
break;
case CR_CURHIDE:
CURHIDE; // Курсор погасить
break;
case CR_DOWN:
case CR_LF:
cr_down(); // Курсор вниз
break;
case CR_UP:
cr_down(); // Курсор вверх
break;
case CR_ENTER:
cr_home(); // Курсор в начало строки
break;
case CR_HOME:
WaitEndCom(0x80); // Курсор в нулевую позицию.
break;
case CR_NEW:
CLEARLCD; // Очистить дисплей.
break;
case CR_CURDIRECT:
cr_direct_flag=1; // Адресовать курсор
break;
case CR_BEEP:
break;
}
}
else{
if(c>=0x80){ // Если символ не латинский, то
c -= 0x80; // Уменьшить таблицу
c = TabWin[c]; // Перекодировать
}
WaitEndData©; // и вывести
}
}
return(1);
}

drozel
Способ перенаправления printf dв EWARM, описанный в хелпе:
http://microsin.net/programming/arm-troubl...r-redirect.html

Всегда делаю так, все работает, scanf не использовал правда
jcxz
В IAR почти не пользуюсь ничем из printf/sprintf/...
Зачем, когда есть _Printf()? Все эти printf/sprintf/... её собственно и вызывают.
Она позволяет задать свою callback-функцию, с помощью которой можно сделать всё что угодно: и перенаправление и вывод в буфер ограниченный размером, и вывод с каким-то спец-форматированием выходного потока -
что угодно, что со стандартными функциями printf/sprintf/... затруднительно.
Пользуйтесь:
extern "C" int _Printf(void *(*)(void *, int), void *, const char *, va_list *);
mantech
Цитата(jcxz @ Nov 27 2015, 06:35) *
В IAR почти не пользуюсь ничем из printf/sprintf/...
Зачем, когда есть _Printf()? Все эти printf/sprintf/... её собственно и вызывают.


Всегда использовал свой printf, более оптимизированный и одинаково работающий под любым компилятором ибо это удобнее, чем всякие закрытые либы иара...
Сергей Борщ
Цитата(mantech @ Nov 27 2015, 14:34) *
чем всякие закрытые либы иара...
Если работает и в память лезет - то можно и закрытые. У ИАРа библиотечный printf довольно вменяемый, в отличие от гцц.
mantech
Цитата(Сергей Борщ @ Nov 27 2015, 16:34) *
Если работает и в память лезет - то можно и закрытые. У ИАРа библиотечный printf довольно вменяемый, в отличие от гцц.


Вот и дело-то в том что изначально была авр-студия,а там он был "не очень"... А когда перешел на иар, просто переташил его за одним rolleyes.gif
Сергей Борщ
Цитата(mantech @ Nov 27 2015, 14:34) *
ибо это удобнее, чем всякие закрытые либы иара...


Цитата(mantech @ Nov 27 2015, 16:39) *
А когда перешел на иар, просто переташил его за одним
Ну да, копировать файлы, подключать их к проекту всяко удобнее, чем не делать этого. biggrin.gif
RusikOk
проблему удалось решить?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.