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

 
 
> stm32f103c8 scanf+printf UART IAR, Проблемы при перенаправлении Printf и Scanf на UART
FAE
сообщение Nov 24 2015, 10:39
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 27-04-05
Из: Spb, Russia
Пользователь №: 4 544



дравствуйте!
Может быть кто-то сталкивался с проблемами при перенаправлении 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
Прикрепленные файлы
Прикрепленный файл  myprintf.zip ( 104.18 килобайт ) Кол-во скачиваний: 21
 
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
SasaVitebsk
сообщение Nov 24 2015, 14:07
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Я просто переписываю putc, getc да и всё. При этом можно перенапривить куда угодно. Например на LCD.
Go to the top of the page
 
+Quote Post
mantech
сообщение Nov 24 2015, 17:11
Сообщение #3


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



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


А координаты вывода как передаете?
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Nov 24 2015, 17:49
Сообщение #4


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

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



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


Текста? Туда где курсор, а курсор всегда сдвигается на длину написанного вправо или вниз и начало строки если строка закончилась.
Можно (если ее нет) сделать функцию для установки позиции курсора.
Go to the top of the page
 
+Quote Post
mantech
сообщение Nov 24 2015, 18:11
Сообщение #5


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



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


Функция не совсем удобно, у себя слегка поправил парсер, чтоб можно было задавать %XN=... %YN=...
Сорри за офтоп rolleyes.gif

Сообщение отредактировал mantech - Nov 24 2015, 18:11
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Nov 25 2015, 06:20
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



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

И что мешает? Я так и делал...
Go to the top of the page
 
+Quote Post
FAE
сообщение Nov 25 2015, 12:53
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 27-04-05
Из: Spb, Russia
Пользователь №: 4 544



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


А вы пользуетесь компилятором IAR?
У меня возникает ошибка, что эти функции уже определены.
А вот fputc и fgets переопределяются нормально
Go to the top of the page
 
+Quote Post
Aleksandr Barano...
сообщение Nov 25 2015, 13:28
Сообщение #8


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

Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118



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

Я пользуюсь IAR, и определяю putchar.


--------------------
ASB
Go to the top of the page
 
+Quote Post
hiranyakashipu
сообщение Nov 25 2015, 21:59
Сообщение #9





Группа: Участник
Сообщений: 13
Регистрация: 10-10-11
Из: Москва
Пользователь №: 67 653



Попробуйте без HAL, через регистры, инициализировать UART и сделать fputc, fgetc.
Вот в этой теме, например, говорится о проблемах в HAL при передаче по UART:
http://electronix.ru/forum/index.php?showt...131520&st=0
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Nov 26 2015, 06:38
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Да пользуюсь 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);
}

Go to the top of the page
 
+Quote Post
drozel
сообщение Nov 26 2015, 06:50
Сообщение #11


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

Группа: Свой
Сообщений: 108
Регистрация: 2-02-11
Пользователь №: 62 650



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

Всегда делаю так, все работает, scanf не использовал правда
Go to the top of the page
 
+Quote Post
jcxz
сообщение Nov 27 2015, 03:35
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



В IAR почти не пользуюсь ничем из printf/sprintf/...
Зачем, когда есть _Printf()? Все эти printf/sprintf/... её собственно и вызывают.
Она позволяет задать свою callback-функцию, с помощью которой можно сделать всё что угодно: и перенаправление и вывод в буфер ограниченный размером, и вывод с каким-то спец-форматированием выходного потока -
что угодно, что со стандартными функциями printf/sprintf/... затруднительно.
Пользуйтесь:
extern "C" int _Printf(void *(*)(void *, int), void *, const char *, va_list *);
Go to the top of the page
 
+Quote Post
mantech
сообщение Nov 27 2015, 11:34
Сообщение #13


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(jcxz @ Nov 27 2015, 06:35) *
В IAR почти не пользуюсь ничем из printf/sprintf/...
Зачем, когда есть _Printf()? Все эти printf/sprintf/... её собственно и вызывают.


Всегда использовал свой printf, более оптимизированный и одинаково работающий под любым компилятором ибо это удобнее, чем всякие закрытые либы иара...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 27 2015, 13:34
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
mantech
сообщение Nov 27 2015, 13:39
Сообщение #15


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



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


Вот и дело-то в том что изначально была авр-студия,а там он был "не очень"... А когда перешел на иар, просто переташил его за одним rolleyes.gif

Сообщение отредактировал mantech - Nov 27 2015, 13:40
Go to the top of the page
 
+Quote Post

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

 


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


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