Как определить конец цепочки, когда ардуинки соединены последовательно через UART (Tx/Rx) ?

sergiu920
Offline
Зарегистрирован: 27.12.2014

Приветствую дорогие форумчани! У меня к вам такой вопрос: Как определить конец цепочки, когда ардуинки соединены последовательно через UART (Tx/Rx) ? 

Или другими словами как определить последнею ардуинку из цепочки? 

Описание проекта, над которым я работаю:

В общем я работаю над одним проектом который состоит из базы(плата FPGA) и пару плат arduino, соединены последовательно через UART. Этот проект я делаю вместе с коллегой, он занимается базой(плата FPGA), а я с платами arduino. К каждой плате arduino будет соединен один светодиод и один потенциометр. 

С базы FPGA мне отправит пакет с данными, который состоит из 2 байта.
Изначалоьно оба байта будут 0. У нас такое условие, если первый байт является 0 то сканируем цепочку и узнаем кол-во ардуинок в цепочки, инкрементируя первый байт. То есть отправляем первый байт, потом отправляем второй байт и проверяем если первый байт равен нулю то инкрементируем второго байта на 1 к каждой плате. Таким образом мы узнаем кол-во ардуинок из цепочки.  

В общем задача состоит из того что нужно узнать кол-во ардуинок из цепочки. 

Описание проблемы: Каждый раз когда инкрементируется второй байт, то я отправляю на базу текущее кол-во плат. То есть сканирую первую плату, отправляю 1, сканирую вторую плату, отправляю 2, сканирую третию плату, отправляю 3 и т.д.
Допустим цепочка состоит из 3 плат, на данный момент я на базу отправляю 1(первая плата) 2 (вторя плата) и 3(третья плата), то есть 123. А нужно отправить только один байт в котором будет кол-во плат, в данном примере нужно отправить только 3 а не 123. 

Текущии скетч загруженный на платах ардуино:
 

#include <SoftwareSerial.h>
SoftwareSerial Serial_1 = SoftwareSerial(2,3); //Rx , Tx

int incoming = 0;
int incoming1 = 0;

boolean NeedTwoByte = true;

int byte1 = 0;
int comanda = 0;
int val = 0;

void setup()
{
  Serial.begin(9600);  //Begin Serial to talk to the Serial Monitor   
  Serial_1.begin(9600); //Begin Serial to talk to the Rx Arduino
}

void loop()
{
    if(Serial.available()){

      
       if (NeedTwoByte){
         
            byte1 = Serial.read();

            NeedTwoByte = false; 
       }            
       else{
              comanda = Serial.read(); // Читаем второй байт. 
        
                if(byte1=='0'){ // Если первый байт равен 0 то инкрементируем второй байт. 
                  comanda++;
                 
                 Serial.write(comanda); // Отправляем текущее значение второго байта.  
                 
// Отправляем байты к второй ардуинки по Tx. 
                 Serial_1.write(byte1); // Равен 0
                 Serial_1.write(comanda); 
                
                }
             
              NeedTwoByte = true; 
    
       }
       
      

   }
  
  
  
    // ==================== From the Rx Arduino ===============
  incoming1 = Serial_1.available();  
  
  while(incoming1 != 0)           //While there is something to be read
  {
    
    
    val = Serial_1.read();

      Serial.write(val); // Выводим кол-во плат. Получаем 123 а нужно только 3. 
    
    
    incoming1 = Serial_1.available();
  }
  
   
}

Как узнать кол-во ардуинок из цепочки и отправить на базу только один байт в котором будет данное кол-во ?

На всех ардуинок должен быть один и тот же скетч.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Сначала подумалось что кто то решил проверить старую теорию о миллионе обезьян и печатных машинках. Типа безсмыслено долбя кнопки напишут Войну и Мир.. поэтому и наблюдаем такое обилие девелопер бордов и сред под них...
но потом вспомнил старую мудрость, два дебила это сила...
последовательный uart... мдааа ... но просто делать +1 ко второму байту ума не хватает...

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

sergiu920, насколько принципиально использовать  именно UART?

Вы уверены, что Ардуино соеденены именно последовательно? Из описания это не очевидно.

sergiu920
Offline
Зарегистрирован: 27.12.2014

На столько что это дипломный проект и так профессор сказал. Использовать именно UART.  Да, я уверен. Они соеденинены последовательно.