iButton

vac
Offline
Зарегистрирован: 01.04.2017

Доброго часа!

Знает ли кто, как привести к правильному формату вывод номера iButton?
Наверняка номера написанные на метках правильные, но как добиться его?

void loop() {
long number ;

  if (ds1990.reset())             // Проверяем, есть ли на линии устройство iButton
  {
    ds1990.write(0x33);           // отправляем команду "считать ROM"
    delay(1);                     // Задержка,для подготовки приёма данных
    for (int i = 0; i < 8; i++)   // Цикл для считывания данных в массив
    {
      address[i] = ds1990.read(); // считываем
    }

    Serial.print("HEX card =");
    for (int i = 0; i < 8; i++)       // Цикл для вывода 8 байт в терминал
    {
      Serial.write(' ');              // Выводим пробел для визуального удобства
      Serial.print(address[i], HEX);  // Выводим данные из массива в формате HEX
    }

  for(uint8_t i = 0 ; i < 8 ;i++)
  {
  number <<= 8;
  number |= address[i];
  }
    Serial.write(' ');
    Serial.print(number);
    Serial.write(' ');
    long &num = (long&)address;
    Serial.print(num);
    Serial.println();
    delay(500);
  }
}

Вывод для метки с номером 0015359120

HEX card = 1 90 5C EA 0 38 0 31 3670065 -363032575
 

Вывод для метки с номером 0012870584

HEX card = 1 B8 63 C4 0 39 0 6C 3735660 -1000097791
 
vac
Offline
Зарегистрирован: 01.04.2017

Задвоилась тема. удалите пожалуйста.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

vac пишет:

Задвоилась тема. удалите пожалуйста.

Обе?

vac
Offline
Зарегистрирован: 01.04.2017

Одну =)

vac
Offline
Зарегистрирован: 01.04.2017

Решено:

первый и последний байт откидываем. первый семейный код, последний crc.

 

vac
Offline
Зарегистрирован: 01.04.2017

Работающий код:

void loop() {
long number ;

  if (ds1990.reset())             // Проверяем, есть ли на линии устройство iButton
  {
    ds1990.write(0x33);           // отправляем команду "считать ROM"
    delay(1);                     // Задержка,для подготовки приёма данных
    for (int i = 0; i < 8; i++)   // Цикл для считывания данных в массив
    {
      address[i] = ds1990.read(); // считываем
    }

    Serial.print("HEX card =");
    for (int i = 0; i < 8; i++)       // Цикл для вывода 8 байт в терминал
    {
      Serial.write(' ');              // Выводим пробел для визуального удобства
      Serial.print(address[i], HEX);  // Выводим данные из массива в формате HEX
    }

  for(uint8_t i = 1 ; i < 7 ;i++)
  {
  number <<= 8;
  number |= address[7-i];
  }

    Serial.print("    serial: ");
    Serial.println(number);
    delay(500);
  }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

все равно неверно, после удаления первого и последнего байта остается последовательность шесть байт, вы ее запихиваете в переменную number, которая только 4 байта = получается ерунда

Чем вас не устраивает HEX формат: 1 90 5C EA 0 38 0 31

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Видимо тем, что номер написанный на метке не соответствует этим данным.

b707
Offline
Зарегистрирован: 26.05.2017

brokly пишет:

Видимо тем, что номер написанный на метке не соответствует этим данным.

ужас :)))

Green
Offline
Зарегистрирован: 01.10.2015

Чего надо то? Получить номер напечатанный на метке? Легко.

ELECTROS
Offline
Зарегистрирован: 28.05.2021

Интересно конечно, сначала хотел написать, потом посмотрел вроде бы решение есть, а потом посмотрел решение и офигел, оно то работает, но зачем лишние движения в цикле (зачем зазря 2 раза пробегать) :

 for(uint8_t i = 1 ; i < 7 ;i++){
	  number <<= 8;
	  number |= address[7-i];
}

и переменную number надо иницилизировать, а не надеяться на компилятор

 

b707
Offline
Зарегистрирован: 26.05.2017

ELECTROS пишет:

потом посмотрел решение и офигел, оно то работает, но зачем лишние движения в цикле (зачем зазря 2 раза пробегать) :

 for(uint8_t i = 1 ; i < 7 ;i++){
	  number <<= 8;
	  number |= address[7-i];
}

и переменную number надо иницилизировать, а не надеяться на компилятор

то есть то, что 4хбайтную переменную 6 раз сдвигают вверх - вас не смутило. вы заметили только дублирование циклов? :)

Это не решение, а сплошное недоразумение, и обсуждать такие мелочи как недоинициализированные переменные смысла нет...

ELECTROS
Offline
Зарегистрирован: 28.05.2021

b707 пишет:

то есть то, что 4хбайтную переменную 6 раз сдвигают вверх - вас не смутило. вы заметили только дублирование циклов? :)

Это не решение, а сплошное недоразумение, и обсуждать такие мелочи как не доинициализированные переменные смысла нет...

Какое еще дублирование, это лишние действия. Как бы про это и сказал, что в цикл 2 раза лишний раз заходим, 2 байта просто улетают в никуда в итоге (это очевидно думаю).  Задача была какая - вычленить, то что написано на самой "таблетке", это решается, но цикл надо было сократить, так помоему:

number = 0; // не удержался
for(uint8_t i = 0 ; i < 4 ;i++){	      
	      number |= address[i+1]<<(8*i);
	}