Форум РадиоКот https://radiokot.ru/forum/ |
|
Преобразование String to char не работает ( https://radiokot.ru/forum/viewtopic.php?f=57&t=189973 |
Страница 1 из 1 |
Автор: | Land [ Сб сен 16, 2023 16:45:27 ] |
Заголовок сообщения: | Преобразование String to char не работает ( |
Доброго всем добрым. Суть вопроса. Есть 7 сегментник, на который должна выводиться инфа в виде значения величины и названия этой величины, типа 120*С. Для управления 7сегментником используется библиотека ардуино SevSeg. Все это запихивается в Атмегу16. И собственно с выводом char на дисплей проблем нет. Проблема появляется когда я пытаюсь преобразовать строку в массив char, который должен передаться библиотеке для вывода на дисплей. В loop'e вот такой кусок кода не желает работать ( Код: static byte val =100; //char pointer[6] = "PAUSE"; myString = "ESUAP"; // Cycle to the next string every one second if (millis() > (timer + 1000)) { val ++; myString = String(val+myString); const char* pointer = myString.c_str(); Serial.println(pointer); sevseg.setChars(pointer); timer = millis(); } sevseg.refreshDisplay(); // Must run repeatedly преобразования из строки в символы не происходит, что видно (вернее не видно) и на дисплее и в выводе в консоль разумеется. Если строки со стрингами комменчу, а char раскомменчу -- вывод идет. Буду очень благодарен за конструктивные мысли. Второй день бьюсь как рыба об асфальт. |
Автор: | veso74 [ Сб сен 16, 2023 17:49:01 ] |
Заголовок сообщения: | Re: Преобразование String to char не работает ( |
с функции класа String? (5 + 1 символов) Код: if (millis() > (timer + 1000)) {
val ++; myString = String(val + myString); char buf[6]; myString.toCharArray(buf, 6); Serial.println(buf); sevseg.setChars(buf); timer = millis(); } |
Автор: | Land [ Сб сен 16, 2023 18:28:50 ] |
Заголовок сообщения: | Re: Преобразование String to char не работает ( |
veso74, увы, нет ( Мистика какая-то... |
Автор: | mont-oriol [ Вс сен 17, 2023 11:20:07 ] |
Заголовок сообщения: | Re: Преобразование String to char не работает ( |
В симуляторе работает. Возможно, стек переполняется от таких тяжёлых операций. Или UB может быть даже не в этом куске кода. |
Автор: | Land [ Вс сен 17, 2023 12:18:29 ] |
Заголовок сообщения: | Re: Преобразование String to char не работает ( |
mont-oriol, да, в симуляторе работает. И про переполнение стека я уже подумал ( тогда вопрос по другому стоит, как к значению переменной прицепить строку символов и вывести это на дисплей. Пока не справился ((( |
Автор: | mont-oriol [ Вс сен 17, 2023 12:53:41 ] |
Заголовок сообщения: | Re: Преобразование String to char не работает ( |
https://wokwi.com/projects/376108925066553345 |
Автор: | veso74 [ Вс сен 17, 2023 13:15:04 ] | ||
Заголовок сообщения: | Re: Преобразование String to char не работает ( | ||
Если я правильно понял задачу из темы (ру->бг), то у меня либ. SevSeg работает и на симулятор, и на реальном устройстве. С классом String проблем нет - с внутренними функциями Arduino. Добавил знак C, использовал символа '^'. При "oC" по 7 seg LCD било "OC". Теперь "oC". Тест: 12oC ![]()
|
Автор: | Land [ Вс сен 17, 2023 15:36:27 ] |
Заголовок сообщения: | Re: Преобразование String to char не работает ( |
mont-oriol, на строку strcpy(position, myString); ругается: Compilation error: invalid conversion from 'u8* {aka unsigned char*}' to 'char*' [-fpermissive] а в вокви все компилируется и собирается. Добавлено after 1 minute 6 seconds: veso74, вот а у меня похоже на железе не желает работать со строками. Но такого быть не может. как я понимаю, вся проблема в использовании MightyCore + Atmega16a |
Автор: | veso74 [ Вс сен 17, 2023 20:20:06 ] | ||
Заголовок сообщения: | Re: Преобразование String to char не работает ( | ||
Работает на симуляторе и на ATmega16. Думаю, первая возможная причина неработы в Вашем случае: разница между реальными и относительными выводами МК в MightyCore: PIN_PA0, PIN_PA ... Код: // byte digitPins[] = {A0, A1, A2, A3}; byte digitPins[] = {PIN_PB0, PIN_PB1, PIN_PB2, PIN_PB3}; // byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13}; // a, b, c, d, e, f, g, h byte segmentPins[] = {PIN_PA0, PIN_PA1, PIN_PA2, PIN_PA3, PIN_PA4, PIN_PA5, PIN_PA6, PIN_PA7}; // a, b, c, d, e, f, g, h ![]()
|
Автор: | BOB51 [ Пн сен 18, 2023 10:16:20 ] |
Заголовок сообщения: | Re: Преобразование String to char не работает ( |
Ну и сложностей то для 7-сегментника... Может достаточно сделать *.h файлик с объявлениями(или соответственно вставку в *.h файле класса индикатора), да использовать его "кодовую таблицу" в конкретном случае? К примеру: СпойлерКод: define s_A 1 // значение номера сегмента A define s_B 7 // значение номера сегмента B define s_C 5 // значение номера сегмента C define s_D 4 // значение номера сегмента D define s_E 2 // значение номера сегмента E define s_F 0 // значение номера сегмента F define s_G 3 // значение номера сегмента G define s_H 6 // значение номера сегмента H /* "кодовая страница кракозябр 7-сегментных" раскладка сегментов по символам определяется стандартной разметкой A-H по условию, что активный уровень(сегмент астивен/светится) принят за 1 */ define fnt_bl 0 define fnt_0 (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_E | 1<<s_F) // цифра 0 или символ "О" define fnt_1 (1<<s_B | 1<<s_C) // цифра 1 define fnt_2 (1<<s_A | 1<<s_B | 1<<s_D | 1<<s_E | 1<<s_G) // цифра 2 define fnt_3 (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_G) // цифра 3 или символ "Э/З" define fnt_4 (1<<s_B | 1<<s_C | 1<<s_F | 1<<s_G) // цифра 4 или символ "Ч" define fnt_5 (1<<s_A | 1<<s_C | 1<<s_D | 1<<s_F | 1<<s_G) // цифра 5 или символ "S" define fnt_6 (1<<s_A | 1<<s_C | 1<<s_D | 1<<s_E | 1<<s_F | 1<<s_G) // цифра 6 define fnt_7 (1<<s_A | 1<<s_B | 1<<s_C) // цифра 7 define fnt_8 (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_E | 1<<s_F | 1<<s_G) // цифра 8 define fnt_9 (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_F | 1<<s_G) // цифра 9 define fnt_A (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_E | 1<<s_F | 1<<s_G) // символ "A" define fnt_b (1<<s_C | 1<<s_D | 1<<s_E | 1<<s_F | 1<<s_G) // символ "b" define fnt_C (1<<s_A | 1<<s_D | 1<<s_E | 1<<s_F) // символ "C" (прямая скобка '[' ) define fnt_d (1<<s_B | 1<<s_C | 1<<s_D | 1<<s_E | 1<<s_G) // символ "d" define fnt_E (1<<s_A | 1<<s_D | 1<<s_E | 1<<s_F | 1<<s_G) // символ "E" define fnt_F (1<<s_A | 1<<s_E | 1<<s_F | 1<<s_G) // символ "F" define fnt_P (1<<s_A | 1<<s_E | 1<<s_F | 1<<s_G | 1<<s_B) // символ "P" define fnt_L (1<<s_E | 1<<s_F | 1<<s_D) // символ "L" define fnt_H (1<<s_B | 1<<s_C | 1<<s_E | 1<<s_F | 1<<s_G) // символ "H" define fnt_U (1<<s_B | 1<<s_C | 1<<s_E | 1<<s_F | 1<<s_D) // символ "U" define fnt_I (1<<s_E | 1<<s_F) // левая 1 или латинская I define fnt_S (1<<s_A | 1<<s_C | 1<<s_D | 1<<s_F | 1<<s_G) // аналог цифры 5 define fnt_J (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_E) // символ "J" define fnt_G (1<<s_A | 1<<s_C | 1<<s_D | 1<<s_E | 1<<s_F) // символ "G" define fnt_r (1<<s_G | 1<<s_E) // символ "r" define fnt_n (1<<s_G | 1<<s_E | 1<<s_C) // символ "п" define fnt_c (1<<s_G | 1<<s_E | 1<<s_D) // символ "с" или '<' define fnt_o (1<<s_G | 1<<s_E | 1<<s_D | 1<<s_C) // нижний кружок "о" define fnt_u (1<<s_C | 1<<s_E | 1<<s_D) // символ "u" define fnt_h (1<<s_C | 1<<s_E | 1<<s_F | 1<<s_G) // символ "h" define fnt_rusg (1<<s_A | 1<<s_E | 1<<s_F) // символ "Г" define fnt_rusP (1<<s_A | 1<<s_E | 1<<s_F | 1<<s_B | 1<<s_C) // символ "П" define fnt_rus_iE (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_G) // символ Э/З/цифра 3 (инверсное Е) define fnt_rusY (1<<s_F | 1<<s_G | 1<<s_B | 1<<s_C | 1<<s_D) // символ "У" define fnt_qest (1<<s_A | 1<<s_B | 1<<s_E | 1<<s_G) // символ "?" define fnt_rC (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D) // символ ']' (обратная скобка/"вывернутая С") define fnt_rc (1<<s_G | 1<<s_C | 1<<s_D) // символ '>' define fnt_gradus (1<<s_A | 1<<s_B | 1<<s_F | 1<<s_G) // верхний кружок "символ грвдуса" define fnt_minus (1<<s_G) // символ "-" (средняя черта) define fnt_aplin (1<<s_A) // символ "верхняя черта" define fnt_dnlin (1<<s_D) // символ "_" (нижняя черта) define fnt_trlin (1<<s_A | 1<<s_G | 1<<s_D) // символ "три черты" define fnt_coma (1<<s_H) // символ "," (децимальная точка) Мне такой вариант больше нравится (и практически в своих конструкциях используется). ![]() |
Автор: | Land [ Пн сен 18, 2023 21:16:58 ] |
Заголовок сообщения: | Re: Преобразование String to char не работает ( |
В общем я так и не понял, с чем столкнулся. Но через sprintf все заработало и все выводится. Тема закрыта. veso74, да, спасибо, я знаю, как выводы в MightyCore прописываются, когда-то прошел и по этим граблям ) BOB51, хм, да, может так и лучше и проще было бы. Надо будет как-то попробовать. Благодарю! |
Автор: | DetSimen [ Ср сен 20, 2023 12:47:28 ] |
Заголовок сообщения: | Re: Преобразование String to char не работает ( |
Никогда так Код: if (millis() > (timer + 1000)) ... не делай. Делай так Код: if (millis() - timer > 1000) ...
|
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |