Одинаковая длина переменной в serial
- Войдите на сайт для отправки комментариев
Ср, 09/03/2016 - 23:56
Всем Привет!
Вопрос таков - есть число в 16-ричном формате, от 0 до примерно 1b77400. Его значение передается по serial'у и обрабатывается в компьютере, но каждый раз длина посылки разная... Подскажите код, чтобы значения были одной длины, например 0000000, 0004A3E, 00F3316 и так далее.
Пытался сам сделать некую процедуру преобразования, но оно эффекта не дало....
Часть моего скетча.
long timeev; int timeevent; String timeev0; void loop() { converttime(); Serial.println(timeevent); void converttime() { String timeevs = String(timeev, HEX); int nsymb = timeevs.length(); if (nsymb=7) { String timeev0=String(timeev, HEX); timeevent=timeev0.toInt(); } if (nsymb=6) { String timeev0=String ("0" + String(timeev, HEX)); timeevent=timeev0.toInt(); } if (nsymb=5) { String timeev0=String ("00" + String(timeev, HEX)); timeevent=timeev0.toInt(); } if (nsymb=4) { String timeev0=String ("000" + String(timeev, HEX)); timeevent=timeev0.toInt(); } if (nsymb=3) { String timeev0=String ("0000" + String(timeev, HEX)); timeevent=timeev0.toInt(); } if (nsymb=2) { String timeev0=String ("00000" + String(timeev, HEX)); timeevent=timeev0.toInt(); } if (nsymb=1) { String timeev0=String ("000000" + String(timeev, HEX)); timeevent=timeev0.toInt(); } if (nsymb=0) { String timeev0=String ("0000000"); timeevent=timeev0.toInt(); } }const byte DESIRED_WIDTH = 7; // строку какой длины надо сделать String buff = "123"; // ваша посылка тут String addZeroes(const String& src, byte pad) { if(src.length() >= pad) return src; String result; byte add = pad - src.length(); while(add--) result += "0"; result += src; return result; } String padded = addZeroes(buff,DESIRED_WIDTH);AntonM , а зачем тибе нужны ведущие нули ?
для красивого вывода данных есть другие методы....
Наверно для парсинга данных, там надо либо разделители пихать, либо строгое соответствие размера посылки.
Чтобы при обрыве канала связи у нас не было ложного значения.
DIYMan, спасибо, сейчас попробую
Чтобы при обрыве канала связи у нас не было ложного значения.
не проще ли тогда сделать через массив или структуру , и отправлять пакетом по ссылке ?
Чтобы при обрыве канала связи у нас не было ложного значения.
не проще ли тогда сделать через массив или структуру , и отправлять пакетом по ссылке ?
Система реального времени, поэтому нельзя
AntonM , при чём здесь "Система реального времени" ?
есть value для отправки , обнулили массив , загрузили массив справо налево значениями value тоже справо налево...
.....ведущие нули уже сидят в массиве
всё , можно отправлять
Чтобы при обрыве канала связи у нас не было ложного значения.
для этого нужно квитирование , а не нули....
const byte DESIRED_WIDTH = 7; // строку какой длины надо сделать String buff = "123"; // ваша посылка тут String addZeroes(const String& src, byte pad) { if(src.length() >= pad) return src; String result; byte add = pad - src.length(); while(add--) result += "0"; result += src; return result; } String padded = addZeroes(buff,DESIRED_WIDTH);Увы, ругается... Одна ошибка - в 4 строке нет ";", а при комплиляции выдает
для этого нужно квитирование , а не нули....
В данный момент именно это надо. Чисто для наладки. Квитирование позже рассматривать будем.
дополнение сообщения нулями никак не поможет от ошибок при потере связи :(
без нулей - отправится 1....3,5 байта ( зависит от value )
с нулями - отправится 3,5 байта ( не зависит от value )
в чём прикол-то ?
для проверки без квитирования можно отправлять CRC и на приёмной стороне проверять CRC....
const byte DESIRED_WIDTH = 7; // строку какой длины надо сделать String buff = "123"; // ваша посылка тут String addZeroes(const String& src, byte pad) { if(src.length() >= pad) return src; String result; byte add = pad - src.length(); while(add--) result += "0"; result += src; return result; } String padded = addZeroes(buff,DESIRED_WIDTH);Увы, ругается... Одна ошибка - в 4 строке нет ";", а при комплиляции выдает
для этого нужно квитирование , а не нули....
В данный момент именно это надо. Чисто для наладки. Квитирование позже рассматривать будем.
Увы, но ошибки в функции нет, во всяком случае - точку с запятой не надо в конце четвёртой строки, т.к. это не объявление функции, а её определение. Если ругается - давайте скетч, поржём, глядя - куда вы чего сунули. Приведённую функцию надо вынести выше loop, к слову, т.е:
String addZeroes(const String& src, byte pad) { if(src.length() >= pad) return src; String result; byte add = pad - src.length(); while(add--) result += "0"; result += src; return result; } void loop() { String mazafaka = addZeroes("УЧИТЕ С++!",100); }Ради интереса засунул функцию в скетч, скомпилировал - цука, компилируется. А ведь навскидку писал, шайтан :)
const byte DESIRED_WIDTH = 7; // строку какой длины надо сделать String buff = "123"; // ваша посылка тут String addZeroes(const String& src, byte pad) { if(src.length() >= pad) return src; String result; byte add = pad - src.length(); while(add--) result += "0"; result += src; return result; } String padded = addZeroes(buff,DESIRED_WIDTH);Увы, ругается... Одна ошибка - в 4 строке нет ";", а при комплиляции выдает
для этого нужно квитирование , а не нули....
В данный момент именно это надо. Чисто для наладки. Квитирование позже рассматривать будем.
Увы, но ошибки в функции нет, во всяком случае - точку с запятой не надо в конце четвёртой строки, т.к. это не объявление функции, а её определение. Если ругается - давайте скетч, поржём, глядя - куда вы чего сунули. Приведённую функцию надо вынести выше loop, к слову, т.е:
String addZeroes(const String& src, byte pad) { if(src.length() >= pad) return src; String result; byte add = pad - src.length(); while(add--) result += "0"; result += src; return result; } void loop() { String mazafaka = addZeroes("УЧИТЕ С++!",100); }Так и делал. Похоже, опять IDE капризничает... сейчас на другой машине попробую.
Скетч - вам надо 5 листов текста? Думаю, нет =)
P.S.: кроме С++, есть много интереснейших языков. Delphi (obj pascal), G-ха и т.п. =) С Си знакомлюсь только сейчас.