Показано с 1 по 7 из 7
  1. #1
    Новичок
    Регистрация
    18.12.2012
    Сообщений
    10
    Вес репутации
    142

    По умолчанию Передача данных между Arduino

    Здравствуйте, собираю систему управления в машину. Состоит из центрального блока на меге и несколько блоков (нано) управления разбросанных по кузову. Все соединено по RS485. Когда сделал первый блок, сконектил к меге без проблем, затем сделал второй, подправил что-то в меге и все, данные теряются.
    Менял только время между командами. Пробовал подстраивать сейчас, не получается. Затем подправил еще скетч, добавил проверку первого и последнего байта. В итоге снова какой то мусор.
    Вот кусок кода slave:
    Код:
    if (RS.available()>=1){byte id=RS.read();
         if(id==30){digitalWrite(13,HIGH);//старт передачи
                    delay(2);
                    RS.write(IDcol),      
                    RS.write(frost),    
                    RS.write(abs(Tmp)),  
                    RS.write(abs(tempd)),  
                    RS.write(spray),    
                    RS.write(Gal),      
                    RS.write(int(MinT)),  
                    RS.write(int(MaxT)),  
                    RS.write(PWM1),      
                    RS.write(PWM2),      
                    RS.write(PWMS),      
                    RS.write(AC),        
                    RS.write(LS),        
                    RS.write(HS),        
                    RS.write(EST),        
                    RS.write(IDcol);      
                    delay(10);
                    digitalWrite(13,LOW);}//стоп передачи
                    }
    А вот прием на мастере:
    Код:
    digitalWrite(13,HIGH);
    delay(1);
    Serial1.write(30);
    delay(1);
    digitalWrite(13,LOW);
    delay(5);
    if (Serial1.available()){   idcol = Serial1.peek();
                                    if(idcol==30){
                                    idcol = Serial1.read();
                                    Frost = Serial1.read();
                                    Tmp1 = Serial1.read();
                                    Tmp2 = Serial1.read();
                                    spray = Serial1.read();
                                    Gal = Serial1.read();
                                    MinT = Serial1.read();
                                    MaxT = Serial1.read();
                                    PWM1 = Serial1.read();
                                    PWM2 = Serial1.read();
                                    PWMS = Serial1.read();
                                    AC = Serial1.read();
                                    LS = Serial1.read();
                                    HS = Serial1.read();
                                    EST = Serial1.read();
                                    IDcol = Serial1.read();
                                    if(idcol==IDcol){ID30_OK=1;}else{ID30_OK=0;}
                                   }}

  2. #2
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,376
    Вес репутации
    10

    По умолчанию Re: Передача данных между Arduino

    Я обычно перед началом пакета отправляю идентификатор из 3-х символов
    Например: "cm="
    Так как пакет может покалечится в силу разных причин и последовательность данных нарушится

    Выглядит примерно вот так:
    Код:
    void loop()    
    {   
     if (UART_ReadByte(inByte)) 
     { 
     if ( packid == 16 ) // контрольная сумма команды cm=
      {  
        packid=0;
        switch (inByte)  // Смотрим какая команда пришла  
        {           
            case 'U': // Серва поднимается  
              if(i > min_pos) myservo1.write(i -= step_servo);    
            break;
            
            case 'J': // Серва опускается  
              if(i < max_pos) myservo1.write(i += step_servo);  
            break;  
              
            case 'K': // Серва поворачивается вправо      
             if(i2 > min_pos) myservo2.write(i2 -= step_servo);  
            break;     
              
            case 'H': // Серва поворачивается влево  
             if(i2 < max_pos) myservo2.write(i2 += step_servo);   
            break;   
             
            case 'C': // Клаксон  
             horn();  
            break;  
            
            case ']': // запрос состояния аналоговых датчиков  
                byte2char(A6_Read,A7_Read);
            break;         
              
            case 'V': // Включить/Выключить фары  
             D9_Low; 
    break;
    } else packet_id(inByte); 
    //**************************************************
    
    void packet_id(uint8_t inbyte)  //проверяем идентификатор пакета "cm="
    {     
        switch (inbyte)  
        {
           case 'c':   
              packid=2;  
            break;
            
           case 'm':   
              packid*=2;  
              //packid=packid<<1;
            break; 
            
           case '=':   
               packid*=4; 
               //packid=packid<<2;
            break;   
            
            default:
               packid=0;  
        }
    } 
    Код взял здесь
    Работает безотказно, проверенно мной
    Последний раз редактировалось Chip; 02.12.2016 в 03:29.

  3. #3
    Новичок
    Регистрация
    18.12.2012
    Сообщений
    10
    Вес репутации
    142

    По умолчанию Re: Передача данных между Arduino

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

Название:	данные.jpg 
Просмотров:	196 
Размер:	133.9 Кб 
ID:	19070
    Красным идентификаторы (30), синим не правильные данные, вместо первого 255, должен быть ноль.

    Изменил скорость на 9600. В первых строках при запуске монитора порта все окей, но потом начинается мусор
    Нажмите на изображение для увеличения. 

Название:	прием норм.jpg 
Просмотров:	198 
Размер:	145.9 Кб 
ID:	19069
    Последний раз редактировалось VXXXV; 02.12.2016 в 18:57.

  4. #4
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,376
    Вес репутации
    10

    По умолчанию Re: Передача данных между Arduino

    нужно весь код смотреть, что бы ошибку найти

  5. #5
    Новичок
    Регистрация
    18.12.2012
    Сообщений
    10
    Вес репутации
    142

    По умолчанию Re: Передача данных между Arduino

    Код:
    //Охлаждение
    float Tmp;
    int Tmp2, Tmp1; 
    byte TGau, MinT, MaxT, PWM1, PWM2, PWMS,spray,Gal,AC,LS,HS,EST,Frost;
    byte ID30_OK, IDcol, idcol;
    //дисплей
    String forNext;
    String inStr = ""; //  приемник информации от Nextion
    
    //Свет
    byte BS_set,BS_NF,DS_set,DS_NF,GAB_set,PTF_set,DRL_set,DRL_30,EPR;// Исходящие данные
    byte Tout1,Tout2,BS_uNF,BS_uset,DS_uNF,DS_uset,GAB_uset,PTF_uset,POV_u,POWER,DRL_u;// Входящие данные
      
    
    void printNextion(const char* data, String top, String page = "0"){
        String spage = "page"+page+"."+top+".txt=\"";
        Serial2.print(spage);
        Serial2.print(data);
        Serial2.print("\"");
        Serial2.write(0xFF);
        Serial2.write(0xFF);
        Serial2.write(0xFF);
    }
    
    void printNextionVal(const char* data, String top, String page = "0"){
        String spage = "page"+page+"."+top+".val=";
        Serial2.print(spage);
        Serial2.print(data);
        Serial2.write(0xFF);
        Serial2.write(0xFF);
        Serial2.write(0xFF);
    }
    
    void setNextionCmd(const char* data){
        Serial2.print(data);
        Serial2.write(0xFF);
        Serial2.write(0xFF);
        Serial2.write(0xFF);
      
    }
    
    String readNextion(){
      char _bite;
      char _end = 0xff;//end of file x3
      String cmd;
      int countEnd = 0;
      unsigned long start = millis();
      while(Serial2.available()>0){
      delay(5);
      if(Serial2.available()>0){
        _bite = Serial2.read();
        cmd += String(_bite, HEX);
        if(_bite == _end){
        countEnd++;
        }
        if(countEnd == 3){
        break;
        }
      }
      }
      return cmd;
    
    }
    
    
    void setup(){
    Serial.begin(57600);   // USB
    Serial1.begin(9600); // ШИНА RS485
    Serial2.begin(115200);// Nextion
    
    
    pinMode(13,OUTPUT);
    setNextionCmd("bkcmd=0");   
    }
    
    void loop(){
        
    
    /*****************************************************************************/
    /*      Прием данных от ID30 Cooler                                          */
    /*****************************************************************************/
    digitalWrite(13,HIGH);
    delay(1);
    Serial1.write(30);
    delay(1);
    digitalWrite(13,LOW);
    delay(45);
    if (Serial1.available()){   idcol = Serial1.peek();
                                    if(idcol==30){
                                    idcol = Serial1.read();
                                    Frost = Serial1.read(); 
                                    Tmp1 = Serial1.read();
                                    Tmp2 = Serial1.read();
                                    spray = Serial1.read();
                                    Gal = Serial1.read();
                                    MinT = Serial1.read();
                                    MaxT = Serial1.read();
                                    PWM1 = Serial1.read();
                                    PWM2 = Serial1.read();
                                    PWMS = Serial1.read();
                                    AC = Serial1.read();
                                    LS = Serial1.read();
                                    HS = Serial1.read();
                                    EST = Serial1.read();
                                    IDcol = Serial1.read();
                                    if(idcol==IDcol){ID30_OK=1;}else{ID30_OK=0;}
                                   }}
                                   else{Serial1.flush();}
                                    
       Serial.print(idcol);
       Serial.print(" ");
       Serial.print(Frost);
       Serial.print(" ");
       Serial.print(Tmp1);
       Serial.print(" ");
       Serial.print(Tmp2);
       Serial.print(" ");
       Serial.print(spray);
       Serial.print(" ");
       Serial.print(Gal);
       Serial.print(" ");
       Serial.print(MinT);
       Serial.print(" ");
       Serial.print(MaxT);
       Serial.print(" ");
       Serial.print(PWM1);
       Serial.print(" ");
       Serial.print(PWM2);
       Serial.print(" ");
       Serial.print(PWMS);
       Serial.print(" ");
       Serial.print(AC);
       Serial.print(" ");
       Serial.print(LS);
       Serial.print(" ");
       Serial.print(HS);
       Serial.print(" ");
       Serial.print(EST);
       Serial.print(" ");
       Serial.print(IDcol);
       Serial.print(" ");
       Serial.println(ID30_OK);
    Приемник, остальной код передачи на дисплей закоментин. Скорость на обоих ставлю одинаковые
    Последний раз редактировалось VXXXV; 02.12.2016 в 19:56.

  6. #6
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,376
    Вес репутации
    10

    По умолчанию Re: Передача данных между Arduino

    возможно скорость порта не совпадает

  7. #7
    Новичок
    Регистрация
    18.12.2012
    Сообщений
    10
    Вес репутации
    142

    По умолчанию Re: Передача данных между Arduino

    снял данные через uart-usb на ноге RX1 mega2560
    Нажмите на изображение для увеличения. 

Название:	порт.jpg 
Просмотров:	227 
Размер:	256.0 Кб 
ID:	19071
    Последний раз редактировалось VXXXV; 02.12.2016 в 20:04.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •