Передача данных между контроллерами

Тема в разделе "Arduino & Shields", создана пользователем TebEnkov2222, 28 май 2019.

Метки:
  1. TebEnkov2222

    TebEnkov2222 Гик

    Я эту тему уже задавал. Но пока так и не разобрался. У меня есть 2 контроллера. Я их соединил по софтверу. Мне нужно сделать передачу данных между ними. Прием-передача. При приходе определенного символа будет осуществляться определенная команда. на данный момент я пытаюсь передать вес с датчиков. Но я не могу понять, почему начинает дробится число при передаче. upload_2019-5-28_21-17-30.png
    (Снизу передающий контроллер, сверху принимающий)
    Код естественно прилагаю. ( и пожалуйста. Не нужно ругаться про не правильное "обзывание" софтвера. И так все прекрасно работает. Другие так делают, а значит и мне можно)
    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial input(8, 9);        // 8 - RX Arduino (TX SIM800L), 9 - TX Arduino (RX SIM800L)
    String comStr = "";
    bool priem = false;
    long tm;
    float str;
    void setup() {
      Serial.begin(9600);               // Скорость обмена данными с компьютером
      Serial.println("Start!");
      input.begin(9600);               // Скорость обмена данными с модемом
      input.println("AT");
    }

    void loop() {
      if (input.available()){           // Ожидаем прихода данных (ответа) от модема...
        char com = input.read();
        //Serial.println(com);
        comStr = comStr + com;
        int leng = comStr.length();
        //Serial.print(leng);
        //Serial.write(' ');
        //Serial.write(com);    // ...и выводим их в Serial
        //Serial.write("   ");
        priem = true;
       
      } else{
        if (comStr != ""){
          //if ( comStr.toFloat() != 0)
          str = comStr.toFloat();
          if (str != 0){
            Serial.println(str);
            str = 0;
          }

          comStr = "";
        }
      }
      if (Serial.available())           // Ожидаем команды по Serial...
        input.write(Serial.read());    // ...и отправляем полученную команду модему
      if (millis() - tm > 5000){
        input.write('t');
        tm = millis();
      }
    }
    const char* IntToChar (unsigned int v) {
      char buffer [20];
      sprintf(buffer, "%d", v);
      return buffer;
    }
    const char* intToStr(int x){
      char b[5];
      String str;
      str=String(x);
      str.toCharArray(b,2);
      return b;
    }
    Код (C++):
    #include <SoftwareSerial.h>
    #include <HX711_ADC.h>
    SoftwareSerial input(8, 9);        // 8 - RX Arduino (TX SIM800L), 9 - TX Arduino (RX SIM800L)
    HX711_ADC LoadCell(4, 5);
    int num = 12;
    long t;
    float testFloat = 12865.85,
          wt = 0;
    char msgBuffer[20];           // убедитесь что стройки размера хватит
    void setup() {
      Serial.begin(9600);               // Скорость обмена данными с компьютером
      Serial.println("Start!");
      input.begin(9600);               // Скорость обмена данными с модемом
      input.println("AT");
      LoadCell.begin();
      long stabilisingtime = 2000;
      LoadCell.start(stabilisingtime);
      LoadCell.setCalFactor(696.0); // user set calibration factor (float)
      Serial.println("Startup + tare is complete");
    }

    void loop() {
    LoadCell.update();
      if (millis() > 250) {
      tenzo();
      }
      if (input.available()) {          // Ожидаем прихода данных (ответа) от модема...
        //Serial.write(input.read());    // ...и выводим их в Serial
        char readInput = input.read();
        //Serial.write(readInput);
        //pointer_to_created_string = dtostrf(wt, 6, 2, msgBuffer);
        if (readInput == 'x'){
          input.println(testFloat);
        }
        if (readInput == 't'){
                Serial.println("----");
          Serial.write(pointer_to_created_string(testFloat));
               
          //Serial.println(wt);
          Serial.println();
         
          input.println(pointer_to_created_string(testFloat));

          //outputPrint(wt);    
          Serial.println("----");
        }
      }
      if (Serial.available())           // Ожидаем команды по Serial...
        input.write(Serial.read());    // ...и отправляем полученную команду модему
       
    }
    void tenzo(){
      wt = LoadCell.getData();
    }
    void outputPrint(float tenzo){
      int fullwt = tenzo*100;
      int inputwt = fullwt;
      Serial.println(fullwt);
      Serial.println();
      int i = 1000000;
      while ( i >=1){
        inputwt = fullwt/ i;
        fullwt = fullwt - (inputwt * i);
            Serial.print("---");
        Serial.print(fullwt);
        Serial.println("---");
        inprt(inputwt);
        i = i/10;
      }
      /*inputwt = inputwt/ 1000000;
      fullwt = fullwt - (inputwt * 1000000);

      inprt(inputwt);
     
      inputwt = fullwt/10000;
      fullwt = fullwt - (inputwt * 10000);
     
      inprt(inputwt);
     
      inputwt = fullwt/100;
      fullwt = fullwt - (inputwt * 100);
      inprt(inputwt);
     
      inprt(fullwt);*/

    }
    char *pointer_to_created_string(float number){
      char *str_to_input = dtostrf(number, 6, 2, msgBuffer);
      return str_to_input;
    }
    const char* IntToChar (unsigned int v) {
      char msgbuffer[20];           // убедитесь что стройки размера хватит
      sprintf(msgbuffer, "%d", v);
      return msgbuffer;
    }
    void inprt(int m){
      Serial.println(m);
      input.println(m);
    }
    Вот честно. Я много разных способов делал. Пытался по числу передавать (не получилось, так как он непонятно почему передавал не те значения (код сохранился, функция называется outputPrint)), пытался просто число через принтлн передавать. Через врайт и конвертер передавал. Море способов, но точной и корректной передачи я не смог получить. На принимающем стоит конвертер во флоат (может в нем проблема).
     
  2. Передатчик:
    Serial.println(x, 8);

    Приемник:
    float x = Serial.parseFloat();

    Вы что-то чудное нагородили.
     
  3. Asper Daffy

    Asper Daffy Иксперд

    Если ты действительно хочешь отладить передачу/приём, то выбрось ВСЁ НАХЕР. (HX711_ADC, LoadCell, calibration) – всё нахер. Оставь ТОЛЬКО передачу значения и приём значения. ВСЁ ОСТАЛЬНОЕ НАХЕР! Скетчи передатчика и приёмника должны быть в несколько строк.

    Отладь передачу и приём, чтобы быть в них уверенным и только после этого добавляй остальное. Пока передача/приём не до конца отлажены, даже не думай добавлять остальную лабуду.

    Если ты так сделаешь и по-прежнему не будет получаться – публикуй скетчи по нескольку строк – посмотрю помогу. А будешь валить в скетч всё сразу – и калибровать и ячейки грузить и корованы грабить – отлаживайся сам.
     
    Tomasina и TebEnkov2222 нравится это.
  4. TebEnkov2222

    TebEnkov2222 Гик

    Мне не по сериалу, к большому сожалению
     
  5. DIYMan

    DIYMan Guest

    Ага, тебе по софтсериалу, который имеет ровно те же методы, что и сериал.
     
  6. TebEnkov2222

    TebEnkov2222 Гик

    Сейчас соберу код за пару минут и отпишусь
     
  7. DIYMan

    DIYMan Guest

    Чо там собирать-то?

    Передатчик:
    Код (C++):

    SoftwareSerial ss(2,3);

    void setup()
    {
      ss.begin(9600);
    }

    void loop()
    {
       static uint8_t toSend = 0;
       ss.write(toSend++);
       delay(1000);
    }
    Приемник:

    Код (C++):

    SoftwareSerial ss(2,3);

    void setup()
    {
      ss.begin(9600);
      Serial.begin(9600);
    }

    void loop()
    {
       while(ss.available())
       {
         Serial.println(ss.read());
       }
    }
     
  8. TebEnkov2222

    TebEnkov2222 Гик

    Ну вот я сделал так, как посоветовали вы. Он принимать - принимает символ, но не отправляет данные на другой мк (толи он не принимает)
    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial input(8, 9);        // 8 - RX Arduino (TX SIM800L), 9 - TX Arduino (RX SIM800L)
    String comStr = "";
    long tm;
    float str;
    void setup() {
      Serial.begin(9600);               // Скорость обмена данными с компьютером
      Serial.println("Start!");
      input.begin(9600);               // Скорость обмена данными с модемом
      //input.println("AT");
    }
    void loop() {
      if (input.available()){
        float x = input.parseFloat();
      }
      if (Serial.available())           // Ожидаем команды по Serial...
        input.write(Serial.read());    // ...и отправляем полученную команду модему
      if (millis() - tm > 5000){
        input.write('t');
        Serial.write('t');
        tm = millis();
      }
    }
     
    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial input(8, 9);        // 8 - RX Arduino (TX SIM800L), 9 - TX Arduino (RX SIM800L)
    long t;
    float testFloat = 12865.85,
          wt = 0;
    char msgBuffer[20];           // убедитесь что стройки размера хватит
    void setup() {
      Serial.begin(9600);               // Скорость обмена данными с компьютером
      Serial.println("Start!");
      input.begin(9600);               // Скорость обмена данными с модемо
      Serial.println("Startup + tare is complete");
    }

    void loop() {
      if (millis() > 250) {
      }
      if (input.available()) {          // Ожидаем прихода данных (ответа) от модема...
        char readInput = input.read();
        if (readInput == 'x'){
          input.println(testFloat,8);
        }
        if (readInput == 't'){
          Serial.write('t');
          input.println(testFloat,8);
        }
      }
      if (Serial.available())           // Ожидаем команды по Serial...
        input.write(Serial.read());    // ...и отправляем полученную команду модему
    }
       
       
     
  9. нет, вы опять какие-то 'x' туда-сюда кидаете зачем-то
     
  10. TebEnkov2222

    TebEnkov2222 Гик

    ХА! Так то и я умею. Мне надо в переменную записать! Вот в чем проблема то..
     
  11. TebEnkov2222

    TebEnkov2222 Гик

    Как вы сказали
     
  12. TebEnkov2222

    TebEnkov2222 Гик

    Если вы про это. то я пытаюсь прием - передачу сделать. Прием работает. А передать значение я не могу(
     
  13. И где у меня кавычки? Вы вообще программировать умеете?
     
    parovoZZ нравится это.
  14. TebEnkov2222

    TebEnkov2222 Гик

    Главный мк посылает каждые 5 секунд "t" по порту на другой мк. Тот принимает и отправляет в СВОЙ сериал "t", а так же отправляет на другой мк пробный флоат. Но он, зараза, то ли не отправляется, то ли не принимается
     
  15. TebEnkov2222

    TebEnkov2222 Гик

    2 года опыта как никак
     
  16. TebEnkov2222

    TebEnkov2222 Гик

    Кавычки. это символ. А мне надо передать ПЕРЕМЕННУЮ! За переменную у меня выступает testFloat, который, если с вашим кодом считать, будет как раз так и х
     
  17. TebEnkov2222

    TebEnkov2222 Гик

    А в кавычках, это что-то на подобии индекса команды. при "x" одна команда будет, при "t" другая будет команда. И так далее
     
  18. TebEnkov2222

    TebEnkov2222 Гик

    upload_2019-5-28_23-5-55.png Что то намудрив, я это все так и сделал. Спасибо. А то, если честно, не одну неделю мучался (а не принималось потому, что я забыл вывод в сериал написать (вернее я думал, что написал)
     
  19. DIYMan

    DIYMan Guest

    Да нет никакой проблемы, есть неумение программировать, вот и всё.

    Передатчик:

    Код (C++):
    SoftwareSerial ss(2,3);

    void setup()
    {
      ss.begin(9600);
    }

    void loop()
    {
       static float toSend = 0.;
       ss.println(toSend++);
       delay(1000);
    }

    Приемник:

    Код (C++):
    SoftwareSerial ss(2,3);

    void setup()
    {
      ss.begin(9600);
      Serial.begin(9600);
    }

    void loop()
    {
       if(ss.available() && ss.find("\n"))
       {
         float f = ss.parseFloat();
         Serial.println(f);
          while(ss.available()) ss.read();
       }
    }
     
  20. Daniil

    Daniil Гуру

    Еще тут можете посмотреть