записать адрес 1-wire rom в переменную - PullRequest
0 голосов
/ 05 апреля 2020

Из набора однопроводных устройств я хочу записать адреса устройств в массив. Я перепробовал много вариантов, но, очевидно, я понятия не имею, как это сделать правильно.

В приведенном ниже коде, в поиске устройства l oop, я получаю адрес, напечатанный в последовательной строке как Я ожидаю этого. Но напечатанный вывод основного l oop указывает, что я в моем способе сохранить этот адрес в массиве ....

#include <OneWire.h>
// http://www.pjrc.com/teensy/td_libs_OneWire.html
OneWire  ds(2);

void setup(void) {
   Serial.begin(9600);
   while (!Serial) {   
  }
}

unsigned char UIDs[12];
int indx=0;

void getDeviceAddresses(void)
{
 int i=0;
 byte present = 0;
 byte done = 0;
 byte data[12];
 byte addr[8];

 while ( !done )
 {
   if ( ds.search(addr) != 1)
   {
     Serial.print("No more addresses.\n");
     ds.reset_search();
     done = 1;
     delay(1000);
     indx=0;
     return;
   }
   else
   {
     Serial.print("Sensors");
     Serial.print(indx);
     Serial.print(" address is:\t");
     indx++;
    //read each byte in the address array
    for( i = 0; i < 8; i++) {
      //Serial.print("0x");
      if (addr[i] < 16) {
        Serial.print('0');   
      }
      // print each byte in the address array in hex format
      UIDs[indx]=(UIDs[indx]+(addr[i], HEX));                    // I guess this is not how to do it....
      Serial.print(addr[i], HEX);
    }
  }
  Serial.println();
 }
}

void loop (){
  getDeviceAddresses();
  int i=0;
  while (true) {
    for ( indx = 0; indx < 13; indx++) {
      Serial.println(UIDs[indx]);    
    }
   delay(4000);
  }
}
Sensors0 address is:    106C402502080064
Sensors1 address is:    101E3C25020800DE
Sensors2 address is:    10614C250208000F
Sensors3 address is:    10513325020800E0
Sensors4 address is:    10094B250208003C
Sensors5 address is:    104D342502080097
Sensors6 address is:    10FD4025020800E2
Sensors7 address is:    10534025020800AD
Sensors8 address is:    1047672502080083
No more addresses.
0
128
128
128
128
128
128
128
128
128
0
0
12

Ответы [ 2 ]

2 голосов
/ 05 апреля 2020

Похоже, что адрес - это массив из 8 байтов, содержащий ваш адрес.

Если вы определите как:

unsigned char UIDs[12][8];

Тогда на каждом проходе через вашу функцию у вас будет:

{
     Serial.print("Sensors");
     Serial.print(indx);
     Serial.print(" address is:\t");
     indx++;
    //read each byte in the address array
    for( i = 0; i < 8; i++) {
      //Serial.print("0x");
      if (addr[i] < 16) {
        Serial.print('0');   
      }
      // print each byte in the address array in hex format
      UIDs[indx][i] = addr[i];         
      Serial.print(addr[i], HEX);
    }
  }

И, наконец, в вашем l oop, чтобы распечатать их :

for ( indx = 0; indx < 13; indx++) {
      for (int i=0; i<8; i++){
         if(UIDs[indx][i] < 16){
            Serial.print('0');
         }
      Serial.print(UIDs[indx][i], HEX);    
    }
0 голосов
/ 06 апреля 2020

@ Delta_G - Спасибо!

Сначала я попробовал 2-мерный массив, но не смог сделать его правильно. Думаю, я испортила вторую процедуру печати. Для дальнейшего использования в случае, если это кому-то понадобится, это полный рабочий тестовый код.

unsigned char UIDs[12][8];
byte indx=0;
byte nr_of_devices=0;
#include <OneWire.h>
// http://www.pjrc.com/teensy/td_libs_OneWire.html
OneWire  ds(2);

void setup(void) {
   Serial.begin(9600);
   while (!Serial) {   
  }
}

void getDeviceAddresses(void)
{
 int i=0;
 byte present = 0;
 byte done = 0;
 byte data[12];
 byte addr[8];

 while ( !done )
 {
   if ( ds.search(addr) != 1)
   {
     Serial.print("No more addresses.\n");
     ds.reset_search();
     done = 1;
     delay(1000);
     nr_of_devices=indx;
     indx=0;
     return;
   }
   else
   {
     Serial.print("Sensors");
     Serial.print(indx);
     Serial.print(" address is:\t");
     indx++;
    //read each byte in the address array
    for( i = 0; i < 8; i++) {
      //Serial.print("0x");
      if (addr[i] < 16) {
        Serial.print('0');    
      }
      // print each byte in the address array in hex format
      UIDs[indx][i] = addr[i];                    
      Serial.print(addr[i], HEX);
      if (!i >= 1) {
        Serial.print("-");
      }
    }
  }
  Serial.println();
 }
}

void loop (){
  getDeviceAddresses();
  int i=0;
  while (true) {
  Serial.println("Sensors found:");
  for ( indx = 1; indx < nr_of_devices; indx++) {
    Serial.print(indx);Serial.print(": ");
      for (int i=0; i<8; i++){
         if(UIDs[indx][i] < 16){
            Serial.print('0');
         }
      Serial.print(UIDs[indx][i], HEX);    

    }
   Serial.println("");
  }
  delay(4000);
  }
}
...