Одинаковая длина переменной в serial

AntonM
Offline
Зарегистрирован: 22.10.2015

Всем Привет!

Вопрос таков - есть число в 16-ричном формате, от 0 до примерно 1b77400. Его значение передается по serial'у и обрабатывается в компьютере, но каждый раз длина посылки разная... Подскажите код, чтобы значения были одной длины, например 0000000, 0004A3E, 00F3316 и так далее.

Пытался сам сделать некую процедуру преобразования, но оно эффекта не дало....

AntonM
Offline
Зарегистрирован: 22.10.2015

Часть моего скетча.

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();
  }
}

 

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

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);

 

 

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

AntonM ,  а зачем тибе нужны ведущие нули ?
для красивого вывода данных есть другие методы....

nevkon
Offline
Зарегистрирован: 20.01.2015

Наверно для парсинга данных, там надо либо разделители пихать, либо строгое соответствие размера посылки.

AntonM
Offline
Зарегистрирован: 22.10.2015

Чтобы при обрыве канала связи у нас не было ложного значения.

AntonM
Offline
Зарегистрирован: 22.10.2015

DIYMan, спасибо, сейчас попробую

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

AntonM пишет:

Чтобы при обрыве канала связи у нас не было ложного значения.

не проще ли тогда сделать через массив или структуру , и отправлять пакетом по ссылке ?

AntonM
Offline
Зарегистрирован: 22.10.2015

SU-27-16 пишет:

AntonM пишет:

Чтобы при обрыве канала связи у нас не было ложного значения.

не проще ли тогда сделать через массив или структуру , и отправлять пакетом по ссылке ?


Система реального времени, поэтому нельзя

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

AntonM ,   при чём здесь "Система реального времени" ?
есть value для отправки , обнулили массив , загрузили массив справо налево значениями 
value тоже справо налево...
.....ведущие нули уже сидят в массиве

всё , можно отправлять 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

AntonM пишет:

Чтобы при обрыве канала связи у нас не было ложного значения.

для этого нужно квитирование , а не нули....

AntonM
Offline
Зарегистрирован: 22.10.2015

DIYMan пишет:

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 строке нет ";", а при комплиляции выдает 

Цитата:
                  ^

sketch_mar10a:22: error: return-statement with a value, in function returning 'void' [-fpermissive]
 return result;
        ^
exit status 1
'src' was not declared in this scope
 

SU-27-16 пишет:

для этого нужно квитирование , а не нули....

В данный момент именно это надо. Чисто для наладки. Квитирование позже рассматривать будем.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

дополнение сообщения нулями никак не поможет от ошибок при потере связи :(
без нулей - отправится 1....3,5 байта ( зависит от value )
с нулями - отправится 3,5 байта ( не зависит от value )

в чём прикол-то ?

для проверки без квитирования можно отправлять CRC и на приёмной стороне проверять CRC....

 

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

AntonM пишет:

DIYMan пишет:

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 строке нет ";", а при комплиляции выдает 

Цитата:
                  ^

sketch_mar10a:22: error: return-statement with a value, in function returning 'void' [-fpermissive]
 return result;
        ^
exit status 1
'src' was not declared in this scope
 

SU-27-16 пишет:

для этого нужно квитирование , а не нули....

В данный момент именно это надо. Чисто для наладки. Квитирование позже рассматривать будем.

 

Увы, но ошибки в функции нет, во всяком случае - точку с запятой не надо в конце четвёртой строки, т.к. это не объявление функции, а её определение. Если ругается - давайте скетч, поржём, глядя - куда вы чего сунули. Приведённую функцию надо вынести выше 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);
}
DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Ради интереса засунул функцию в скетч, скомпилировал - цука, компилируется. А ведь навскидку писал, шайтан :)

AntonM
Offline
Зарегистрирован: 22.10.2015

DIYMan пишет:

AntonM пишет:

DIYMan пишет:

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 строке нет ";", а при комплиляции выдает 

Цитата:
                  ^

sketch_mar10a:22: error: return-statement with a value, in function returning 'void' [-fpermissive]
 return result;
        ^
exit status 1
'src' was not declared in this scope
 

SU-27-16 пишет:

для этого нужно квитирование , а не нули....

В данный момент именно это надо. Чисто для наладки. Квитирование позже рассматривать будем.

 

Увы, но ошибки в функции нет, во всяком случае - точку с запятой не надо в конце четвёртой строки, т.к. это не объявление функции, а её определение. Если ругается - давайте скетч, поржём, глядя - куда вы чего сунули. Приведённую функцию надо вынести выше 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-ха и т.п. =) С Си знакомлюсь только сейчас.