Страница 1 из 1
Преобразование String to char не работает (
Добавлено: Сб сен 16, 2023 16:45:27
Land
Доброго всем добрым.
Суть вопроса. Есть 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 раскомменчу -- вывод идет.
Буду очень благодарен за конструктивные мысли. Второй день бьюсь как рыба об асфальт.
Re: Преобразование String to char не работает (
Добавлено: Сб сен 16, 2023 17:49:01
veso74
с функции класа 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();
}
Re: Преобразование String to char не работает (
Добавлено: Сб сен 16, 2023 18:28:50
Land
veso74, увы, нет (
Мистика какая-то...
Re: Преобразование String to char не работает (
Добавлено: Вс сен 17, 2023 11:20:07
mont-oriol
В симуляторе работает.
Возможно, стек переполняется от таких тяжёлых операций.
Или UB может быть даже не в этом куске кода.
Re: Преобразование String to char не работает (
Добавлено: Вс сен 17, 2023 12:18:29
Land
mont-oriol, да, в симуляторе работает. И про переполнение стека я уже подумал (
тогда вопрос по другому стоит, как к значению переменной прицепить строку символов и вывести это на дисплей. Пока не справился (((
Re: Преобразование String to char не работает (
Добавлено: Вс сен 17, 2023 12:53:41
mont-oriol
Re: Преобразование String to char не работает (
Добавлено: Вс сен 17, 2023 13:15:04
veso74
Если я правильно понял задачу из темы (ру->бг), то у меня либ. SevSeg работает и на симулятор, и на реальном устройстве. С классом String проблем нет - с внутренними функциями Arduino. Добавил знак C, использовал символа '^'. При "oC" по 7 seg LCD било "OC". Теперь "oC".
Тест: 12oC

Re: Преобразование String to char не работает (
Добавлено: Вс сен 17, 2023 15:36:27
Land
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
Re: Преобразование String to char не работает (
Добавлено: Вс сен 17, 2023 20:20:06
veso74
Работает на симуляторе и на 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

Re: Преобразование String to char не работает (
Добавлено: Пн сен 18, 2023 10:16:20
BOB51
Ну и сложностей то для 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) // символ "," (децимальная точка)
Мне такой вариант больше нравится (и практически в своих конструкциях используется).

Re: Преобразование String to char не работает (
Добавлено: Пн сен 18, 2023 21:16:58
Land
В общем я так и не понял, с чем столкнулся. Но через sprintf все заработало и все выводится. Тема закрыта.
veso74, да, спасибо, я знаю, как выводы в MightyCore прописываются, когда-то прошел и по этим граблям )
BOB51, хм, да, может так и лучше и проще было бы. Надо будет как-то попробовать. Благодарю!
Re: Преобразование String to char не работает (
Добавлено: Ср сен 20, 2023 12:47:28
DetSimen
Никогда так
не делай. Делай так