Полная версия этой страницы:
Кодировка STDIO
KeMikadze
Apr 24 2011, 10:54
Здравствуйте!
Использую библиотеку stdio и среду Keil. Передаю данные от процессора на комп по следующей схеме:
LPC2368 (UART0 9600 Baud Rate )->FT232(COM2)->Терминальная программа (Flash Magic, AT200, PuTTY)
На всех выше перечисленных терминалах приходят какие-то крякозяблики вместо текста. Эксперементировал с разными кодировками, но это не помогло.
Подскажите в какой кодировке передает данные STDIO, и как мне получать их в терменале в нормальном виде?
STDIO должен передавать символы в той кодировке, в которой у вас исходники.
Была похожая проблема на STM32, оказалось, что настройки передатчика и приемника разные. Проверьте дебаггером какие бинарные данные поступают в регистр UARTа и какие вы получаете на ПК. В моем случае была проблема с битом четности, т.к. STM32 и ПК обрабатывают его по разному.
KeMikadze
Apr 24 2011, 12:32
Цитата(gba @ Apr 24 2011, 14:50)

STDIO должен передавать символы в той кодировке, в которой у вас исходники.
Была похожая проблема на STM32, оказалось, что настройки передатчика и приемника разные. Проверьте дебаггером какие бинарные данные поступают в регистр UARTа и какие вы получаете на ПК. В моем случае была проблема с битом четности, т.к. STM32 и ПК обрабатывают его по разному.
Спасибо за совет. Ну на проце я проверю, что на UART идет, а вот как я на компе узнаю какие "бинарные" данные приходят? Просто у меня логического анализатора под рукой нету.
Цитата(KeMikadze @ Apr 24 2011, 16:32)

а вот как я на компе узнаю какие "бинарные" данные приходят? Просто у меня логического анализатора под рукой нету.
Я смотрел с помощью
PortMon. Подключаете PuTTY к нужному порту и дальше мониторите порт через PortMon. Еще как вариант, можно самому написать маленькую софтинку, которая будет читать порт.
KeMikadze
Apr 24 2011, 14:03
Цитата(gba @ Apr 24 2011, 16:25)

Я смотрел с помощью
PortMon. Подключаете PuTTY к нужному порту и дальше мониторите порт через PortMon. Еще как вариант, можно самому написать маленькую софтинку, которая будет читать порт.
щас попробую, а пока на всякий случай вот код програмки может ошибки какие найдутся:
CODE
#include <stdio.h>
#include <LPC23xx.H> /* LPC23xx definitions */
int main (void) {
PINSEL0 |= 0x00000050; /* Enable TxD0 and RxD0 */
U0FDR = 0; /* Fractional divider not used */
U0LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */
U0DLL = 104; /* 2400 Baud Rate @ 4.0 MHZ Internal RC */
U0DLM = 0;
U0LCR = 0x03; /* DLAB = 0 */
while (1)
{ /*Посылаю: В терменале появляется: */
printf ("Hello/n/r"); //TеллоOнOР
printf ("Привет/n/r"); //ПьбеБOнOР
printf ("123/n/r"); //qrs_нOР
}
}
Очень похоже на то, что у меня было из-за включенного Parity Check... А на других BaudRate'ах тоже самое?
Кстати, вот это не верно:
Код
printf ("123/n/r");
Неправильный слеш, должен быть обратный, а не прямой. И обычно все-таки \r\n последовательность
KeMikadze
Apr 25 2011, 03:59
Цитата(gba @ Apr 24 2011, 17:55)

Очень похоже на то, что у меня было из-за включенного Parity Check... А на других BaudRate'ах тоже самое?
Пробовал на 9600 и на 2400 и там и там крякозяблики, вот только не помню одинаковые крякозяблики выходят на разных скоростях или нет. Ну сегодя ради интереса проверю. Во всяком случае на 2400 для каждой из передаваемых фраз всегда одни и те же крякозяблики появляются, что как мне кажется исключает влияние помех.
Я уже грешным делом начал подумывать написать какой-небудь преобразователь их в православный язык :-)
А не может это быть из-за того что я от внутреннего RC-генератора работаю?
Да вот похоже, что смещение разное все время. Попробуйте вывести весь латинский алфавит, интересно что получится
Цитата(KeMikadze @ Apr 25 2011, 07:59)

А не может это быть из-за того что я от внутреннего RC-генератора работаю?
К сожалению, в этом вопросе не силён, но если быстро на внешний кварц переделать можете, то можно попробовать.
KeMikadze
Apr 25 2011, 14:10
Цитата(gba @ Apr 25 2011, 12:03)

Да вот похоже, что смещение разное все время. Попробуйте вывести весь латинский алфавит, интересно что получится
К сожалению, в этом вопросе не силён, но если быстро на внешний кварц переделать можете, то можно попробовать.
Теоретически вывести на внешний кварц могу, а практически уже вторую неделю с настройкой PLL бъюсь, не хочет он у меня никакие кварцы признавать, виснет постоянно. Смог только к часовому кварцу привязать его, да и то там чота с множетелями непонятно. Когда множетель равен 9 то кварц признает, а когда скажем 15 то уже ни в какую... Но думаю это темя для отдельного поста который в ближайшее время я хочу запостить.
KeMikadze
Apr 26 2011, 19:11
вывел весь латинский алфавит:
printf ("ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n"); ->> ¦¦-¬L-++T++?--¦¦¦¦-ЁЄгІЇT¦¦
printf ("abcdefghijklmnopqrstuvwxyz\r\n"); ->> абцдефгхыйклмноПЯРСТУФВЬЫЗ
судя по всему переданные и полученные байты отличаются 6-им битом, вот только не могу понять почему...
А со второй-то строкой, что случилось? Откуда транслитерация?
Попробуйте передать данные с одного UART'а проца на другой - и через printf(), и напрямую.
KeMikadze
Apr 27 2011, 15:26
Цитата(gba @ Apr 27 2011, 07:28)

А со второй-то строкой, что случилось? Откуда транслитерация?
Попробуйте передать данные с одного UART'а проца на другой - и через printf(), и напрямую.
Попробую подключить завтра логический анализатор на UART и посмотреть. У меня подозрение что это моя FT-шка чота не то творит
KeMikadze
Apr 28 2011, 15:02
Подключил анализатор, попробовал... Вывод - дело в ARM-е. UART выдает какраз ту ерунду которая приходит в терминал. Только вот интересно в каком месте кода я ошибся...
KeMikadze
Apr 28 2011, 17:26
Проблему я решил но по програмерски)) Покавырявшись в настройках я пришел к выводу что единственное в чем я мог ошибится - это выбор делителя для скорости. Набросав на скорую руку функцию которая в цикле инкрементирует этот делитель от 1 до бесконечности, я запустил пошаговую отладку где на каждом шаге смотрел значение в делителе и смотрел что появляется в терминале. В общем что-либо начало появлятся где-то со значения делителя окого 24-х, но это были всякие крякозаблики сменяющие один другой по мере учеличения делителя. Правильные цифры и буквы появились со значения делителя примерно 92, это при том что расчетное значение у меня 104. Дальше начиная со значения 100 и выше опять начали появлятся крякозяблики.
Свой делитель я расчитывал по даташиту, после чего проверял на калькуляторе скачаном с официального сайта Keil-а, и значение всегда было 104.
В следствии чего я могу сделать вывод что заявленное компанией NXP строчка User Manual-а "The nominal IRC frequency is 4MHz." скорее всего не соответствует действительности так как, я проводил расчет какраз для данной частоты. При этом не каких экстремальных температурных условия у меня не было. Ну во всяком случае не советую использовать для работы с UART-ом внутренний генератор.
Ну и ещё вопрос знатокам, латинские буквы и цифры STDIO у меня выводит, а может ли она выводить и русские буквы? В моем случае вместо русского Привет я получил "оПХБЕР", либо опять в настройки UART-а лезть надо?
AHTOXA
Apr 28 2011, 20:25
Цитата(KeMikadze @ Apr 28 2011, 23:26)

В моем случае вместо русского Привет я получил "оПХБЕР", либо опять в настройки UART-а лезть надо?
Скорее, в настройки терминала. Задайте в гипертерминале шрифт "Courier New".
Ну или в редакторе включите кодировку CP866. Короче, надо чтоб кодировка редактора исходных текстов соответствовала кодировке терминальной программы.
KeMikadze
May 1 2011, 07:11
Цитата(AHTOXA @ Apr 28 2011, 23:25)

Скорее, в настройки терминала. Задайте в гипертерминале шрифт "Courier New".
Ну или в редакторе включите кодировку CP866. Короче, надо чтоб кодировка редактора исходных текстов соответствовала кодировке терминальной программы.
Ну в общем разобрался я с кодировками, правда вместо CP866 выставил в терминале Win1251 (Cyrillic), но за идею спасибо.
Прошу тему считать закрытой. Всем спасибо за поддержку!
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.