Помогите создать функцию которая преобразует int в char

MaksVV
Offline
Зарегистрирован: 06.08.2015

Мне нужно отправлять данные в Wi-Fi сериал монитор. Но специфика отправки такова, что перед отправкой нужно сначала всё записать в буфер (подсчитать количество символов и т.д.).  и потом уже собранное сообщение отправляется на ESP в wi-fi.

Текст понятно как в буфер добавлять, а вот значения переменных? Решил воспользоваться itoa. Но каждый раз писать четыре строчки не айс. Решил создать функцию, которой мы передаём нашу переменную, там переменная преобразовывается в массив char temp[] и этот массив возвращается функцией... так я хотел чтобы работало. Но... вот скетч

#define BUFF_LENGTH 128  // буфер для отправки на ESP
char buff [BUFF_LENGTH];

int S = 245; // переменная 


void setup() {
  Serial.begin (38400);

  //Собираем сообщение в буфер на ESP
  strcat(buff, "Rasstoyanie = ");
  strcat(buff, print_intVar(S));
  strcat(buff, " km");  
  strcat(buff, "\r\n");
  
  Serial.println (buff); //Распечатаем пока просто в сериал, для ESP остальной код не привожу, чтобы не мешал

  for (int k =0;k<BUFF_LENGTH;k++ ) buff[k]=0;// чистим буфер
  }

void loop() {
 

}

char* print_intVar (int var){
char temp[4];
itoa(var, temp, 10) ;
return temp;
}

 

Скетч работает, но не всегда переменную в чар переводит, ну всмысле не добавляется она в буфер. Сразу говорю, что я хотел функцию просто char Printvar (int var) {} сделать  - не скомпилировалось, т.к. возвращается массив символов. Я в указателях ничего пока не петрю. но добавил * и ,о чудо, заработало)) Хотелось бы разобраться, что это я такое сделал и почему иногда не работет. 

sadman41
Offline
Зарегистрирован: 19.10.2016

О каких четырех строчках речь?

MaksVV
Offline
Зарегистрирован: 06.08.2015

было с функцией

 strcat(buff, "Rasstoyanie = ");
  strcat(buff, print_intVar(S));
  strcat(buff, " km");  

без функции, просто много раз это нужно повторять. Многабукаф получится

strcat(buff, "Rasstoyanie = ");
 {char temp[4]; 
 itoa(S, temp, 10); 
 strcat(buff, temp);}
 strcat(buff, " km");  
 strcat(buff, "\r\n");

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

В строке 27 поставьте перед char ключевое слово static, чтобы буфер не протухал по выходу из функции. А то у вас функция возвращает указатель на что-то там на стеке, непорядок.

sadman41
Offline
Зарегистрирован: 19.10.2016

itoa (S, &buff[write_position], 10) - заставит itoa() поместить все свои значки в массив, начиная с необходимой позиции.

А если у вас этих операций десятки, то смотрите в сторну sprintf() / sprintf_P().

MaksVV
Offline
Зарегистрирован: 06.08.2015

пасиб, буду пробовать

MaksVV
Offline
Зарегистрирован: 06.08.2015

DIYMan пишет:

В строке 27 поставьте перед char ключевое слово static, чтобы буфер не протухал по выходу из функции. А то у вас функция возвращает указатель на что-то там на стеке, непорядок.

Респект, теперь все четко.