Передача данных с целым значением и символами
- Войдите на сайт для отправки комментариев
Пнд, 07/11/2016 - 15:19
Необходимо проверять целостность дошедших до приложения данных. Как сформировать строку вида ("[("+data+")]") и отправить её при помощи Serial.println()? data - переменная типа int.
Ну, есть 100500 способов.
Можно при помощи класса String, если оперативной памяти не жалко.
Можно при помощи функции sprintf (или sprintf_P) если не жалко памяти программы
А если жалко и того и другого, можно при помощи функций itoa, и strcpy.
Ссылки у Вас есть, изучайте, выбирайте как Вам лучше и делайте.
Благодарю.
К сожалению, приходят [(0)]. Пробовал при помощи функции itoa и класса String.
Значит, не так пробовали. Скетч не покажете? Секрет?
Код 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);В первом топике Вы писали про int, а теперь, оказывается foat, который Вы как-то уж больно нагло к int преобразовываете.
По сути.
1) вторая часть совсем не в дугу, это не так делается. Зачем Вы туда String вообще приплели? Я же говорил Вам, что String - это когда памяти не жалко, а itoa / str??? - когда память нужно беречь. А Вы всё в кучу слили. Сейчас покажу, как это делается. В течение получас-часа доберусь до ардуины и выложу.
2) первая часть так на глаз должны нормально работать, сейчас проверю.
Общее:
для отладки всегда печатайте информацию ДО преобразования И после. Т.е. в данном случае Вам надо было ещё напчечатать еще и
int(dist_cm). Стало бы намного виднее. Напрмер, Вы говорите, что нули получаются. Так вот, я думаю, что у Васint(dist_cm)равно 0.Ладно, сейчас доберусь и что-нибудь выложу.
Вот, держите примеры. Что-то я прокомментировал, но если что, читайте описания использованных функций и разбирайтесь.
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 других. Дело-то несложное, просто бояться не надо.
Спасибо за примеры. Разобрался. Кстати, по поводу нулей: видимо, это из-за того, что датчику не хватало питания. Подключил к ПК и нулей больше нет.
по поводу нулей: видимо, это из-за того, что датчику не хватало питания. Подключил к ПК и нулей больше нет.
Вот и я про то. При отладке печатать надо в начале (срызу после получения с датчика) и после преобразования. Тогда намного всё диднее. А Вы в начале не печатали и получили проблему на ровном месте. Привыкайте.