Нужна помощь со скетчем приема данных

Тема в разделе "Arduino & Shields", создана пользователем AlessandrIT, 22 окт 2017.

  1. AlessandrIT

    AlessandrIT Гик

    По ТЗ на Ардуино Нано приходит строка (в скетче видно,что она собирается посимвольно),где порядок единиц и нулей определяет какие пины включить а какие - выключить.Использовано управление портами через регистры а то скорость работы совсем уж маленькая.

    приходящая строка это 11 управляющих бит информации. 1 бит - D2, 2 бит, - D3 и так далее по накатанной.В текущем скетче какую бы строку я не посылал (при условии её длинны 11 символов) D13 зажигается (про остальные знать не могу).данные посылались в разных режимах через com port монитор

    Забыл упомянуть - пока реализовано лишь частичное управление,ибо использован 1 оператор управления - PORTB.

    Вот
    Код (C++):
    int i;
    int j;
    char inc[11];
    char CharArrayVar[9];
    char CharVar;
    String inc2;
    String out;
    int pins[11] = {0,0,0,0,1,1,1,1,1,1,1}; // 1 - OUTPUT 0 - INPUT
    char val;

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

      //-----------------------
      for (i = 2;i <= 13;i++) {
        if (pins[i - 2] == 0) {
          pinMode(i,INPUT);
          out += ("0;");
        }
        if (pins[i - 2] == 1) {
          pinMode(i,OUTPUT);
          out += ("1;");
        }
      }

      //PORTB = B00011100;
      Serial.println(out);
      Serial.println("go");
      Serial.flush();
      char CharArrayVar[8] = {0,0,0,0,0,0,0,0};
    }

    void loop() {
       char CharArrayVar[8] = {0,0,0,0,0,0,0,0};
       inc2 = "";
       int ai = 0;
       while (true) {
          if (Serial.available() > 0) {
             val = Serial.read();
             inc[ai + 1] += val;
             ai += 1;
          }
          if (ai == 11) {
             break;
          }
       }
       Serial.flush();
       //Serial.println(inc);
       for (j = 3;j <= 8; j++) {
           CharArrayVar[j] = inc[14 - j];
       }
       CharVar = 0;
       for(int i = 1; i<8; i++)
       {
       CharVar |= CharArrayVar[i] << (7-i);
       }
       PORTB = CharVar;
       Serial.println(CharVar);
       }
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    зачем там Serial.flush();?
     
  3. AlessandrIT

    AlessandrIT Гик

    Был случай когда от данных,посланных в функции setup, бесился код в loop: непонятные данные и т.д.

    Сам не знаю,надо оно или нет
     
  4. DIYMan

    DIYMan Guest

    Ооох. Короче, вводные, если я правильно понял:

    1. Входящая строка должна быть чётко 11 символов длиной;
    2. В строке нолики и единицы привязаны к пинам, начиная с соответствия "первый символ - пин D2";
    3. Надо по этой строке управлять пинами.

    Если так, то простейший код:
    Код (C++):
    String buff;

    void parseCommand(const String& command)
    {
        int startPin = 2;
        for(int i=0;i<command.length();i++,startPin++)
        {
            char ch = command[i];
            byte level = ch == '1' ? HIGH : LOW;
            digitalWrite(startPin,level);
        }
    }

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

    void loop()
    {
        while(Serial.available())
        {
            char ch = Serial.read();
            buff += ch;
           
            if(buff.length() == 11)
            {
                parseCommand(buff);
                buff = "";
            }
        }
    }
     
  5. AlessandrIT

    AlessandrIT Гик

    Благодарю за помощь.Одно из условий ТЗ было управление через регистры напрямую,полагаю теперь будет проще.Спасибо
     
  6. AlessandrIT

    AlessandrIT Гик

    Может кто опыт имеет,логику работы текущего кода понять пока не могу.
    Посылаю строку
    запрос - ответ
    00000000000 - 11111111111111111111111111110000
    00000000011 - 11111111111111111111111111110100
    11111111111 - 11111111111111111111111111110111
    Первое - то что я отсылал через монитор, второе - эта же строка после преобразований.
    А ведь должно быть одно и то же,только первое - строка, а второе - бинарная переменная для PORTB


    Код:
    Код (C++):
    String buff;
    char Charu[11] = {0,0,0,0,0,0,0,0,0,0,0};
    int pins[11] = {0,0,0,0,1,1,1,1,1,1,1}; // 1 - OUTPUT 0 - INPUT
    String out;

    void setup()
    {
        Serial.begin(9600);
        //-----------------------
      for (int i = 2;i <= 13;i++) {
        if (pins[i - 2] == 0) {
          pinMode(i,INPUT);
          out += ("0;");
        }
        if (pins[i - 2] == 1) {
          pinMode(i,OUTPUT);
          out += ("1;");
        }
      }

      //PORTB = B00011100;
      Serial.println(out);
      Serial.println("go");
      Serial.flush();
    }

    void loop()
    {
        while(Serial.available())
        {
            char ch = Serial.read();
            buff += ch;
       
            if(buff.length() == 11)
            {        
                char charBufVar[11];
                buff.toCharArray(charBufVar, 11);
                char Charu[11] = {0,0,0,0,0,0,0,0,0,0,0};
                for (int ab = 0; ab <= 5; ab++) {
                   Charu[ab + 3] = charBufVar[11 - ab];
                }
                char CharVar = 0;
                Serial.println(buff);
                for(int i = 0; i<8; i++)
                {
                CharVar |= Charu[i] << (7-i);
                }
                PORTB = CharVar;
                Serial.println(CharVar,BIN);
                buff = "";
            }
        }
    }
     
     
    Последнее редактирование: 22 окт 2017