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

Тема в разделе "Arduino & Shields", создана пользователем Defender, 5 фев 2019.

  1. Defender

    Defender Нерд

    Добрый день. Хочу передавать данные от метео датчиков на сайт народного мониторинга. Датчики через специальную плату передают данные в виртуальный COM-порт Arduino Nano. Эти данные будут отправляться на сайт народного мониторинга через gprs модем от Амперки. В связи с этим вопрос как правильно реализовать передачу данных из SoftwareSerial в HardwareSerial?
    Я пробую так:

    Код (C++):
      mySerial.print(WindDirection());
      int W = WindDirection();
      Serial.print(W);
    В мониторе порта действительно появляются значения от датчика направления ветра, но вместе с ними появляются ещё какие-то символы:
    135 135 459T 135 135 135
    Где 135 это реальное направление ветра. А вот эти 459Т - лишняя какая-то гадость :)
     
  2. b707

    b707 Гуру

    А вы думаете, если на Народмон послать голую цифру "135" - он поймет?
    Это я к тому. что вы не с того конца заходите. Нужно не просто пересылать байты из одного Сериала в другой - а еще и правильно их обрабатывать. Заодно и мусор, который у вас сейчас лезет в порт - отсеете.
     
  3. Defender

    Defender Нерд

    Да, я понимаю, что там есть специальная форма для отправки на сайт. Я просто начал делать задачу от простого к сложному. Вначале подключил датчики к аппаратному порту на 0 и 1 пины. Убедился, что всё работает. Затем переподключил их на 10 и 11 пин и решил передать из виртуального в аппаратный. Далее уже планировал работать с модемом ... Мне просто непонятно, что это за мусор такой? Откуда он? Помехи?
    Подскажите, что конкретно Вы имеете ввиду под правильной обработкой байтов?
     
  4. полный код
    полная схема
    фото сборки

    все это важно, а не только три строчки, вырванные из контекста
     
  5. parovoZZ

    parovoZZ Гуру

    а смысл в такой рокировке? Соединить куском провода нельзя?
     
  6. Defender

    Defender Нерд

    Что именно соединить?
     
  7. parovoZZ

    parovoZZ Гуру

    датчик, нану и жопорез от Амперки.
     
  8. Defender

    Defender Нерд

    У GPRS шилда от Амперки пины 0 и 1 это UART. Будет ли правильно туда же подключить датчики? Не будет никакой путаницы с приёмом информации от датчиков и в то же время с отправкой её через GPRS?
     
  9. Defender

    Defender Нерд

    Пока что код только для снятия показаний с датчиков. Передачу из виртуального сериала в аппаратный пробовал осуществить только на датчике направления ветра. Да ещё в скетче есть датчик температуры и влажности DHT21 подключённый к 5 пину.

    Код (C++):
    #include <TroykaDHT.h>
    #include <SoftwareSerial.h>

    DHT dht(5, DHT21);

    SoftwareSerial mySerial(10, 11); // RX, TX

    char                 databuffer[35];
    double               temp;

    void setup()
    {
      Serial.begin(9600);
      mySerial.begin(9600);
      dht.begin();
    }
    void loop()
    {
       dht.read();
       switch(dht.getState()) {
          case DHT_OK:
          mySerial.print("Temperature = ");
          mySerial.print(dht.getTemperatureC());
          mySerial.println(" C \t");
          mySerial.print("Humidity = ");
          mySerial.print(dht.getHumidity());
          mySerial.println(" %");
          break;
        // ошибка контрольной суммы
        case DHT_ERROR_CHECKSUM:
          mySerial.println("Checksum error");
          break;
        // превышение времени ожидания
        case DHT_ERROR_TIMEOUT:
          mySerial.println("Time out error");
          break;
        // данных нет, датчик не реагирует или отсутствует
        case DHT_ERROR_NO_REPLY:
          mySerial.println("Sensor not connected");
          break;
      }


    getBuffer();
      mySerial.print("Wind Direction: ");
      mySerial.print(WindDirection());
      mySerial.println("  ");

      mySerial.print(WindDirection());
      int W = WindDirection();
      Serial.print(W);

      mySerial.print("Average Wind Speed (One Minute): ");
      mySerial.print(WindSpeedAverage());
      mySerial.println("m/s  ");
      mySerial.print("Max Wind Speed (Five Minutes): ");
      mySerial.print(WindSpeedMax());
      mySerial.println("m/s");
      mySerial.print("Rain Fall (One Hour): ");
      mySerial.print(RainfallOneHour());
      mySerial.println("mm  ");
      mySerial.print("Rain Fall (24 Hour): ");
      mySerial.print(RainfallOneDay());
      mySerial.println("mm");
      mySerial.print("Temperature: ");
      mySerial.print(Temperature());
      mySerial.println("C  ");
      mySerial.print("Humidity: ");
      mySerial.print(Humidity());
      mySerial.println("%  ");
      mySerial.print("Barometric Pressure: ");
      mySerial.print(BarPressure());
      mySerial.println("hPa");
      mySerial.println("");
      mySerial.println("");

      delay(2000);
    }



    void getBuffer()                                                                
    {
      int index;
      for (index = 0;index < 35;index ++)
      {
        if(mySerial.available())
        {
          databuffer[index] = mySerial.read();
          if (databuffer[0] != 'c')
          {
            index = -1;
          }
        }
        else
        {
          index --;
        }
      }
    }
    int transCharToInt(char *_buffer,int _start,int _stop)                          
    {
      int _index;
      int result = 0;
      int num = _stop - _start + 1;
      int _temp[num];
      for (_index = _start;_index <= _stop;_index ++)
      {
        _temp[_index - _start] = _buffer[_index] - '0';
        result = 10*result + _temp[_index - _start];
      }
      return result;
    }
    int WindDirection()                                                                  //Wind Direction
    {
      return transCharToInt(databuffer,1,3);
    }
    float WindSpeedAverage()                                                             //air Speed (1 minute)
    {
      temp = 0.44704 * transCharToInt(databuffer,5,7);
      return temp;
    }
    float WindSpeedMax()                                                                 //Max air speed (5 minutes)
    {
      temp = 0.44704 * transCharToInt(databuffer,9,11);
      return temp;
    }
    float Temperature()                                                                  //Temperature ("C")
    {
      temp = (transCharToInt(databuffer,13,15) - 32.00) * 5.00 / 9.00;
      return temp;
    }
    float RainfallOneHour()                                                              //Rainfall (1 hour)
    {
      temp = transCharToInt(databuffer,17,19) * 25.40 * 0.01;
      return temp;
    }
    float RainfallOneDay()                                                               //Rainfall (24 hours)
    {
      temp = transCharToInt(databuffer,21,23) * 25.40 * 0.01;
      return temp;
    }
    int Humidity()                                                                       //Humidity
    {
      return transCharToInt(databuffer,25,26);
    }
    float BarPressure()                                                                  //Barometric Pressure
    {
      temp = transCharToInt(databuffer,28,32);
      return temp / 10.00;
    }
     
    Последнее редактирование: 5 фев 2019
  10. Defender

    Defender Нерд