1

Topic: Вопрос по "текстовой строке"

Подскажите, как корректно вывести на экран температуру со значком градусов цельсия, например:  «t=-10.1 °С»?

2

Re: Вопрос по "текстовой строке"

Можно так

  
  float val = -10.1;
  char sval[7];  // сюда поместим число как строку, уесть максимально возможное 
                 // количество символов числа + один завершающий 0
  dtostrf(val, 0, 1, sval); // преобразуем число в строку
  sprintf (RemoteXY.text_1, "t=%s °С", sval); // собираем результирующую строку

3

Re: Вопрос по "текстовой строке"

В данный момент текстовая строка поддерживает 3 типа данных (текст, целое, вещественное). Мне кажется, было бы неплохо добавить варианты "дата" и "время". Либо м.б. вообще выделить в отдельный элемент управления с возможностью синхронизации времени с мобильного устройства?

4

Re: Вопрос по "текстовой строке"

klen wrote:

В данный момент текстовая строка поддерживает 3 типа данных (текст, целое, вещественное).

Вообще то вы не совсем правы. В текстовую строку вы можете вывести абсолютно любую информацию. И текстовая строка поддерживает только текст. Если вы хотите что то в нее вывести вам просто надо значение преобразовать в текст. Хоть числа, хоть время хоть вообще что угодно.

5

Re: Вопрос по "текстовой строке"

Прошу прощения, спутал тему, имел в виду не индикатор типа текстовая строка, а элемент управления "поле ввода".

6

Re: Вопрос по "текстовой строке"

Да, тогда вы правы. Все это запланировано.

7

Re: Вопрос по "текстовой строке"

remotexy wrote:

Можно так

  
  float val = -10.1;
  char sval[7];  // сюда поместим число как строку, уесть максимально возможное 
                 // количество символов числа + один завершающий 0
  dtostrf(val, 0, 1, sval); // преобразуем число в строку
  sprintf (RemoteXY.text_1, "t=%s °С", sval); // собираем результирующую строку

с "dtostrf" - все нормально. а вот "sprintf" - в листинге программы подсвечивается ... и при компиляции выдает ошибку:




C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp: In function 'main':

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51:1: error: unable to find a register to spill in class 'NO_REGS'

}

^

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51:1: error: this is the insn:

(insn 1326 1323 1329 123 (set (mem:QI (post_dec:HI (reg/f:HI 32 __SP_L__)) [0  S1 A8])

        (subreg:QI (reg/f:HI 1365) 1)) W:\Users\KRV\Documents\2017\SharePoint\Внутренний сайт - Файлы\Умный РґРѕРј\Arduino\ArdM\ArdM.ino:707 1 {pushqi1}

     (expr_list:REG_ARGS_SIZE (const_int 5 [0x5])

        (nil)))

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51: confused by earlier errors, bailing out

lto-wrapper: C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc returned 1 exit status

c:/program files (x86)/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.9.2/../../../../avr/bin/ld.exe: lto-wrapper failed

collect2.exe: error: ld returned 1 exit status

exit status 1
Ошибка компиляции для платы Arduino/Genuino Uno.

8

Re: Вопрос по "текстовой строке"

Похоже ругается на какую то скобку. Проверьте.
}
^

9

Re: Вопрос по "текстовой строке"

remotexy wrote:

Похоже ругается на какую то скобку. Проверьте.
}
^


Эх, если бы было все так просто.
Попробовал я убрать из кода все лишнее...

Вот вариант А
____________________________________________________

//////////////////////////////////////////////
//        RemoteXY include library          //
//////////////////////////////////////////////

...         для экономии места на форуме убрал

/////////////////////////////////////////////
//           END RemoteXY include          //
/////////////////////////////////////////////


void setup() 
{
   RemoteXY_Init (); 
   
}

void loop() {
  RemoteXY_Handler ();

  float val =  -10.1;
  char sval[7];  // сюда поместим число как строку, уесть максимально возможное
                 // количество символов числа + один завершающий 0
  dtostrf(val, 0, 1, RemoteXY.text_temp_int);   
// dtostrf(val, 0, 1, sval); // преобразуем число в строку 
// sprintf (RemoteXY.text_temp_int, "t=%s °С", sval); // собираем результирующую строку
}


_______________________________________________
в таком варианте все ок


Две последние строчки снимаем открываем, получаем вариант B:

_______________________________________________
//////////////////////////////////////////////
//        RemoteXY include library          //
//////////////////////////////////////////////

...         для экономии места на форуме убрал

/////////////////////////////////////////////
//           END RemoteXY include          //
/////////////////////////////////////////////


void setup() 
{
   RemoteXY_Init (); 
   
}

void loop() {
  RemoteXY_Handler ();

  float val =  -10.1;
  char sval[7];  // сюда поместим число как строку, уесть максимально возможное
                 // количество символов числа + один завершающий 0
//  dtostrf(val, 0, 1, RemoteXY.text_temp_int);   
  dtostrf(val, 0, 1, sval); // преобразуем число в строку 
  sprintf (RemoteXY.text_temp_int, "t=%s °С", sval); // собираем результирующую строку
}

__________________________________________

и после компиляции получаем следующее сообщение

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp: In function 'main':

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51:1: error: unable to find a register to spill in class 'NO_REGS'

}

^

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51:1: error: this is the insn:

(insn 819 816 822 48 (set (mem:QI (post_dec:HI (reg/f:HI 32 __SP_L__)) [0  S1 A8])

        (subreg:QI (reg/f:HI 470) 1)) D:\Документы\Arduino\Test\Test\Test.ino:189 1 {pushqi1}

     (expr_list:REG_ARGS_SIZE (const_int 5 [0x5])

        (nil)))

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp:51: confused by earlier errors, bailing out

lto-wrapper: C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-gcc returned 1 exit status

c:/program files (x86)/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.9.2/../../../../avr/bin/ld.exe: error: lto-wrapper failed

collect2.exe: error: ld returned 1 exit status

exit status 1
Ошибка компиляции для платы Arduino/Genuino Uno.



______________________________________________


Капаем дальше. Теперь решил вообще с 0 собрать маленький проект

_______________________________________________
//////////////////////////////////////////////
//        RemoteXY include library          //
//////////////////////////////////////////////

...         Тут другой текст

/////////////////////////////////////////////
//           END RemoteXY include          //
/////////////////////////////////////////////


void setup() 
{
   RemoteXY_Init (); 
   
}

void loop() {
  RemoteXY_Handler ();

  float val =  -10.1;
  char sval[7];  // сюда поместим число как строку, уесть максимально возможное
                 // количество символов числа + один завершающий 0
  dtostrf(val, 0, 1, sval); // преобразуем число в строку 
  sprintf (RemoteXY.text_temp_int, "t=%s °С", sval); // собираем результирующую строку
}

______________________________________________________
В таком варианте все работает.
А это значит, что ошибка где то во фрагменте RemoteXY include!!!
Я могу отправить листинг на емайл, который указан в контактах? Поможете разобраться?

10

Re: Вопрос по "текстовой строке"

отправьте полный  первый листинг который не компилируется, на info@remotexy.com

11

Re: Вопрос по "текстовой строке"

Действительно непонятно.
Во многих местах пишут что ошибка компилятора. Но будем изучать эту штуку.
Вот такой код работает:

  float val =  -10.1;
  char sval[7];
  char temp[20];
  dtostrf (val, 0, 1, sval); // преобразуем число в строку   
  sprintf (temp, "t=%s °С", sval); // собираем результирующую строку
  strcpy (RemoteXY.text_temp_int, temp); // копируем строку в переменную RemoteXY

12

Re: Вопрос по "текстовой строке"

Здравствуйте. А где можно прочитать про текстовые строки, с подробным описанием элементов? Например,
sprintf (temp, "t=%s °С", sval);, что такое t=%s ?

13

Re: Вопрос по "текстовой строке"

Добрый день. Сразу прошу прощения за простой вопрос, но что-то я совсем запутался.
Есть две переменные типа float (GPS координаты) и есть желание вывести их в одно тестовое поле с точностью в 4 знака после запятой, разделив символом ":".
Если честно я совсем запутался. Помогите пожалуйста.

14

Re: Вопрос по "текстовой строке"

float val_1 =  10.1111;
float val_2 =  20.22221;
  char sval_1 [7];
  char sval_2 [7];
  dtostrf (val_1, 7, 4, sval_1); // преобразуем число в строку   
  dtostrf (val_2, 7, 4, sval_2);
  sprintf (RemoteXY.text_1, "%s : %s ", sval_1, sval_2); // собираем результирующую строку

Что я делаю не так?

15

Re: Вопрос по "текстовой строке"

Что вы делаете не так:
1. Вы не учитываете количество символов, которое должно поместиться в строку после преобразования числа + завершающий 0. Выводимое число 10.1111 имеет 7 знаков + завершающий 0, итого требуется 8 байт для его хранения как строка. После такого преобразования у вас происходит затирание памяти которое расположено после переменной sval_1 , а что там располагается известно только компилятору, по этому скорее всего программа у вас будет непонятно глючить или просто виснуть. Это особенность языка С++ который не контролирует доступ к памяти, за этим должен следить программист. Выход, вы должны определить какое максимальное количество символов может иметь число после преобразования и добавить еще один символ для завершающего нуля. Возможно char sval_1 [8] будет достаточно если целая часть числа у вас всегда будет не более чем двузначная.
2. Из вашего примера не видно длину поля RemoteXY.text_1. Возможно ошибка та же что и описана в предыдущем пункте.

16 (edited by sergibus0 2018-11-08 17:22:38)

Re: Вопрос по "текстовой строке"

Спасибо, про завершающий символ я забыл:( теперь все работает.
Еще вопрос. А возможно организовать перенос строки?

17

Re: Вопрос по "текстовой строке"

sergibus0 wrote:

Еще вопрос. А возможно организовать перенос строки?

Текстовая строка в RemoteXY не поддерживает перенос. Но вы можете разместить на экране 2 строки друг под дружкой и реализовать перенос программно, т.е. разделить текст между этими строками на стороне Arduino.