Соединение двух Arduino Uno по SPI...

Тема в разделе "Проводная и беспроводная связь", создана пользователем matwaysha, 2 май 2019.

  1. Daniil

    Daniil Гуру

    Все правильно значит) вы ведь по 8 байт отсылаете, вот он их и насчитывает.
    Эм...повторите, пожалуйста все опыты, только поставьте галочку hex в передатчике, чтобы в нижнем поле он выводил хексы, а не символы.
    т.е. всегда минус 89, независимо от того что отправляете?
    Разный размер пачек (7) значит число занимает меньше байт, чем вы привыкли.
    Минус 90 градусов в передатчике превращаются в 0. (-90+90)*1е3=0.
    0 в хекс будет 0х00 - 1 байт.
    Т.е. могут быть случаи когда команда будет выглядеть так:
    ":", "А", 0х00, "/n" - т.е. в данном случае пачка состоит из 4ех байт.
    Можете выводить на дисплей еще tmp? Последите за ним.
     
  2. matwaysha

    matwaysha Нерд

    При чот такой строчке (они шли один за другим)
    upload_2019-5-4_17-35-52.png
    все идет +8 каждый раз
    Да, всегда - 89, иногда, правда, проскакивает -90.
     
  3. matwaysha

    matwaysha Нерд

    upload_2019-5-4_17-38-12.png
    Вот последняя отправка в нужном виде.
     
  4. Daniil

    Daniil Гуру

    Отправьте, пожалуйста,:
    3A 41 02 0F 58 0A
    Что произойдёт?
     
  5. Daniil

    Daniil Гуру

    Приравняйте, пожалуйста, в передатчике x=-87.175 (Пусть алгоритм сам всё вычислит, надо его проверить)
    Покажите, что он отсылает.
     
  6. matwaysha

    matwaysha Нерд

    Выдает -89 и счетчик 6, отправляю несколько раз - 6, 12, 18 идет.
     
  7. Daniil

    Daniil Гуру

    Переместите вывод на дисплей перед обнулением tmp, строки и флага. И там же добавьте вывод tmp, indexEnd, indexStart и inputString.length().
    Отправьте всё ту же команду.
    Ищем проблемное место.
     
  8. matwaysha

    matwaysha Нерд

    При такой константе в программе выдает 3A 41 42 30 38 0A, :AB08\n, почему - то при подключении к головной плате на экране все нули, даже счетчик.
     
  9. matwaysha

    matwaysha Нерд

    Там моя ошибка подсоединил неправильно, экран выдает -89.
     
  10. Daniil

    Daniil Гуру

    Подключать 2 ардуинки пока нет смысла. Что-то не так работает и в передатчике. К нему вернёмся позже. Но запомним этот факт.
    Дайвайте добъём приёмник.
    Надо посмотреть чему равны индексы и коды из сообщения №87.
     
  11. matwaysha

    matwaysha Нерд

    Залил такой код -
    Код (C++):
    void loop() {
      lcd.setBacklight(255);
      lcd.home(); lcd.clear();
      if(stringComplete == true){
       
        for(int i = 0; i < inputString.length(); i++){
          k++;
          if(inputString[i] == '\n'){
            indexEnd = i - 1;
          }
          if(inputString[i] == ':'){
            indexStart = i + 1;
          }
        }
        m = inputString.length();
        for(int i = indexStart + 1; i <= indexEnd; i++){
          tmp = inputString[i];
          if(i != indexEnd){
            tmp = tmp << 8;
          }
        }
        if(inputString[indexStart] == 'A'){
          x = (((float)tmp)/1e3) - 90;
        }
        else{
          y = (((float)tmp)/1e3) - 90;
        }
        lcd.setCursor(0,1);
        lcd.print(indexEnd);
        lcd.setCursor(4,1);
        lcd.print(indexStart);
        lcd.setCursor(0,0);
        lcd.print(m);
        lcd.setCursor(0,6);
        lcd.print(tmp);
        tmp = 0;
        stringComplete = false;
        inputString = "";
      }
     
      lcd.setCursor(13,1);
      lcd.print(k);
    }
    печатается только счетчик - все остальные даже не нули, их просто нет.
     
  12. matwaysha

    matwaysha Нерд

    Но счетчик работает.
     
  13. Daniil

    Daniil Гуру

    Нашёл!
    Не моё это( не пользуюсь стрингами, вот и забыл.
    Обращение к элементам String по индексу нужно делать так: String.substring(index).
    Получается везде где мы работали с inputString надо заменить на inputString.substring(i)

    Почитал документацию и родил такой код:
    Код (C++):
    void loop() {
      lcd.setBacklight(255);
      lcd.home(); lcd.clear();
      if(stringComplete == true){

       indexEnd=inputString.indexOf('\n')-1; \\пропал цикл по поиску
       indexStart=inputString.indexOf(':')+1; \\теперь это 2 строчки

        for(int i = indexStart + 1; i <= indexEnd; i++){
          tmp = tmp + inputString.charAt(i); \\ мы тут накапливаем данные, на ранее про это забыли!
          if(i != indexEnd){
            tmp = tmp << 8;
          }
        }

        if(inputString.charAt(indexStart) == 'A'){
          x = (((float)tmp)/1.0e3) - 90.0;
        }
        else{
          y = (((float)tmp)/1.0e3) - 90.0;
        }
        lcd.setCursor(0,1);
        lcd.print(indexEnd);
        lcd.setCursor(4,1);
        lcd.print(indexStart);
        lcd.setCursor(0,6);
        lcd.print(tmp);
        tmp = 0;
        stringComplete = false;
        inputString = "";
      }
      lcd.setCursor(13,1);
      lcd.print(k);
    }
     
    matwaysha нравится это.
  14. matwaysha

    matwaysha Нерд

    Так как нужные значения не показывались на экране в целом, переписал код так:
    Код (C++):
    void loop() {
      lcd.setBacklight(255);
      lcd.home(); lcd.clear();
      if(stringComplete == true){
         indexEnd=inputString.indexOf('\n')-1;
         indexStart=inputString.indexOf(':')+1;
        for(int i = indexStart + 1; i <= indexEnd; i++){
          tmp = inputString.charAt(i);
          if(i != indexEnd){
            tmp = tmp << 8;
          }
        }
        if(inputString.charAt(indexStart) == 'A'){
          x = (((float)tmp)/1e3) - 90;
        }
        else{
          y = (((float)tmp)/1e3) - 90;
        }
        /*lcd.setCursor(0,1);
        lcd.print(indexEnd);
        lcd.setCursor(4,1);
        lcd.print(indexStart);
        lcd.setCursor(0,0);
        lcd.print(m);
        lcd.setCursor(0,6);
        lcd.print(tmp);*/

        tmp = 0;
        stringComplete = false;
        inputString = "";
      }
       lcd.setCursor(0,1);
      lcd.print(x);
      lcd.setCursor(8,1);
      lcd.print(y);
      lcd.setCursor(13,1);
      lcd.print(k);
    }
    углы по - прежнему -89.
     
  15. matwaysha

    matwaysha Нерд

    или там substring всё - таки нужно?
     
  16. matwaysha

    matwaysha Нерд

    При попытке записать substring выдает такую ошибку:
    exit status 1
    cannot convert 'String' to 'uint32_t {aka long unsigned int}' in assignment
     
  17. Daniil

    Daniil Гуру

    indexEnd и indexStart всё-таки ещё интересуют, да и tmp.
    Выводите всё. Что-то должно поменяться.
    Посыпаю голову пеплом - определим методом научного тыка и проверки всех индексов)
     
  18. Daniil

    Daniil Гуру

    Ну, значит не надо)
     
  19. Daniil

    Daniil Гуру

    Проверьте, у меня там tmp=tmp+....
    (я любитель редактировать сообщение после его опубликования)
     
  20. matwaysha

    matwaysha Нерд

    Полученные значения настораживают. Ввожу то значение, получаю indexEnd = 6; indexStart = 1; длина (совсем настораживает) = 4.
    Код такой:
    Код (C++):
    void loop() {
      lcd.setBacklight(255);
      lcd.home(); lcd.clear();
      if(stringComplete == true){
         indexEnd=inputString.indexOf('\n')-1;
         indexStart=inputString.indexOf(':')+1;
        for(int i = indexStart + 1; i <= indexEnd; i++){
          tmp = tmp + inputString.charAt(i);
          if(i != indexEnd){
            tmp = tmp << 8;
          }
        }
        if(inputString.charAt(indexStart) == 'A'){
          x = (((float)tmp)/1e3) - 90;
        }
        else{
          y = (((float)tmp)/1e3) - 90;
        }
          m = inputString.length();
        lcd.setCursor(0,6);
        lcd.print(tmp);
        tmp = 0;
        stringComplete = false;
        inputString = "";
      }
      lcd.setCursor(0,1);
        lcd.print(indexEnd);
        lcd.setCursor(4,1);
        lcd.print(indexStart);
        lcd.setCursor(0,0);
        lcd.print(m);
       /*lcd.setCursor(0,1);
      lcd.print(x);
      lcd.setCursor(8,1);
      lcd.print(y);
      lcd.setCursor(13,1);
      lcd.print(k);*/

    }