iButton
- Войдите на сайт для отправки комментариев
Ср, 26/05/2021 - 20:02
Доброго часа!
Знает ли кто, как привести к правильному формату вывод номера 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
Задвоилась тема. удалите пожалуйста.
Задвоилась тема. удалите пожалуйста.
Обе?
Одну =)
Решено:
первый и последний байт откидываем. первый семейный код, последний crc.
Работающий код:
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); } }все равно неверно, после удаления первого и последнего байта остается последовательность шесть байт, вы ее запихиваете в переменную number, которая только 4 байта = получается ерунда
Чем вас не устраивает HEX формат: 1 90 5C EA 0 38 0 31
Видимо тем, что номер написанный на метке не соответствует этим данным.
Видимо тем, что номер написанный на метке не соответствует этим данным.
ужас :)))
Чего надо то? Получить номер напечатанный на метке? Легко.
Интересно конечно, сначала хотел написать, потом посмотрел вроде бы решение есть, а потом посмотрел решение и офигел, оно то работает, но зачем лишние движения в цикле (зачем зазря 2 раза пробегать) :
for(uint8_t i = 1 ; i < 7 ;i++){ number <<= 8; number |= address[7-i]; }и переменную number надо иницилизировать, а не надеяться на компилятор
потом посмотрел решение и офигел, оно то работает, но зачем лишние движения в цикле (зачем зазря 2 раза пробегать) :
for(uint8_t i = 1 ; i < 7 ;i++){ number <<= 8; number |= address[7-i]; }и переменную number надо иницилизировать, а не надеяться на компилятор
то есть то, что 4хбайтную переменную 6 раз сдвигают вверх - вас не смутило. вы заметили только дублирование циклов? :)
Это не решение, а сплошное недоразумение, и обсуждать такие мелочи как недоинициализированные переменные смысла нет...
то есть то, что 4хбайтную переменную 6 раз сдвигают вверх - вас не смутило. вы заметили только дублирование циклов? :)
Это не решение, а сплошное недоразумение, и обсуждать такие мелочи как не доинициализированные переменные смысла нет...
Какое еще дублирование, это лишние действия. Как бы про это и сказал, что в цикл 2 раза лишний раз заходим, 2 байта просто улетают в никуда в итоге (это очевидно думаю). Задача была какая - вычленить, то что написано на самой "таблетке", это решается, но цикл надо было сократить, так помоему:
number = 0; // не удержался for(uint8_t i = 0 ; i < 4 ;i++){ number |= address[i+1]<<(8*i); }