Передача данных с целым значением и символами

Natt_Nei
Offline
Зарегистрирован: 28.10.2016

Необходимо проверять целостность дошедших до приложения данных. Как сформировать строку вида ("[("+data+")]") и отправить её при помощи Serial.println()? data - переменная типа int.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, есть 100500 способов.

Можно при помощи класса String, если оперативной памяти не жалко.

Можно при помощи  функции sprintf (или sprintf_P) если не жалко памяти программы

А если жалко и того и другого, можно при помощи функций itoa, и strcpy.

Ссылки у Вас есть, изучайте, выбирайте как Вам лучше и делайте.

Natt_Nei
Offline
Зарегистрирован: 28.10.2016

Благодарю.

Natt_Nei
Offline
Зарегистрирован: 28.10.2016

К сожалению, приходят [(0)]. Пробовал при помощи функции itoa и класса String.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Значит, не так пробовали. Скетч не покажете? Секрет?

Natt_Nei
Offline
Зарегистрирован: 28.10.2016
Код                      
String str = "";
str ="[(";
float dist_cm = ultrasonic.Ranging(CM);
String d = String(int(dist_cm));
str = str + d;
str = str + ")]";
Serial.println(str);

//или с функцией itoa
String str = "";
str ="[(";
float dist_cm = ultrasonic.Ranging(CM);
char strC[5] ;
itoa(int(dist_cm), strC, 10);
str = str + strC;
str = str + ")]";
Serial.println(str);

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В первом топике Вы писали про int, а теперь, оказывается foat, который Вы как-то уж больно нагло к int преобразовываете.

По сути. 

1) вторая часть совсем не в дугу, это не так делается. Зачем Вы туда String вообще приплели? Я же говорил Вам, что String - это когда памяти не жалко, а itoa / str??? - когда память нужно беречь. А Вы всё в кучу слили. Сейчас покажу, как это делается. В течение получас-часа доберусь до ардуины и выложу.

2) первая часть так на глаз должны нормально работать, сейчас проверю.

Общее:

для отладки всегда печатайте информацию ДО преобразования И после. Т.е. в данном случае Вам надо было ещё напчечатать еще и  int(dist_cm). Стало бы намного виднее. Напрмер, Вы говорите, что нули получаются. Так вот, я думаю, что у Вас int(dist_cm) равно 0.

Ладно, сейчас доберусь и что-нибудь выложу.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вот, держите примеры. Что-то я прокомментировал, но если что, читайте описания использованных функций и разбирайтесь.

void setup(void) {
	Serial.begin(115200);
	int intNumber = 321;	// число, которое будем печатать
	//
	//	Оперативной памяти не жалко. Используем String
	//
	String str = "[(";
	str += intNumber;
	str +=  ")]";
	Serial.println(str);
	
	//
	//	Памяти программы не жалко. Используем sprintf
	//
	char szBuf[11]; // 11 потому, что максимальная длина int - 6 символов + 4 ("[()]") + 1 (место для 0)
	sprintf(szBuf, "[(%d)]", intNumber);
	Serial.println(szBuf);
	
	//
	//	Экономим память. Используем str??? и itoa
	//
	char *szB = "[(-12345)]"; // резервируем буфер под максимально возможную длину
	itoa(intNumber, szB + 2, 10); // +2, чтобы пропустить [( в начале строки
	strcat(szB, ")]"); // к концу получившегося числа придвигаем ")]"
	Serial.println(szB);
}

void loop(void) {}

/////////////////
//	Результат
//	[(321)]
//	[(321)]
//	[(321)]

Как я уже говорил, здесь три способа. Существует ещё 100500-3 других. Дело-то несложное, просто бояться не надо.

Natt_Nei
Offline
Зарегистрирован: 28.10.2016

Спасибо за примеры. Разобрался. Кстати, по поводу нулей: видимо, это из-за того, что датчику не хватало питания. Подключил к ПК и нулей больше нет.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Natt_Nei пишет:

по поводу нулей: видимо, это из-за того, что датчику не хватало питания. Подключил к ПК и нулей больше нет.

Вот и я про то. При отладке печатать надо в начале (срызу после получения с датчика) и после преобразования. Тогда намного всё диднее. А Вы в начале не печатали и получили проблему на ровном месте. Привыкайте.