|
stm32f103c8 scanf+printf UART IAR, Проблемы при перенаправлении Printf и Scanf на UART |
|
|
|
Nov 24 2015, 10:39
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Nov 25 2015, 12:53
|
Участник

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

|
Цитата(SasaVitebsk @ Nov 24 2015, 17:07)  Я просто переписываю putc, getc да и всё. При этом можно перенапривить куда угодно. Например на LCD. А вы пользуетесь компилятором IAR? У меня возникает ошибка, что эти функции уже определены. А вот fputc и fgets переопределяются нормально
|
|
|
|
|
Nov 25 2015, 13:28
|
Частый гость
 
Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118

|
Цитата(FAE @ Nov 25 2015, 07:53)  А вы пользуетесь компилятором IAR? У меня возникает ошибка, что эти функции уже определены. А вот fputc и fgets переопределяются нормально Я пользуюсь IAR, и определяю putchar.
--------------------
ASB
|
|
|
|
|
Nov 25 2015, 21:59
|
Группа: Участник
Сообщений: 13
Регистрация: 10-10-11
Из: Москва
Пользователь №: 67 653

|
Попробуйте без HAL, через регистры, инициализировать UART и сделать fputc, fgetc. Вот в этой теме, например, говорится о проблемах в HAL при передаче по UART: http://electronix.ru/forum/index.php?showt...131520&st=0
|
|
|
|
|
Nov 26 2015, 06:38
|
Гуру
     
Группа: Свой
Сообщений: 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); }
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|