Не работает прием команд через последовательный порт

Тема в разделе "Arduino & Shields", создана пользователем Suyano, 12 июн 2018.

  1. Suyano

    Suyano Нерд

    Доброго времени суток! Есть код, который должен принимать команды через (UART)
    Код (C++):
    #define RAPI_BUFLEN 13
    int LAMP_STATE = 0;


    class RAPI {
      int m_RAPIinByte; // RAPI byte being read in
      char m_RAPIinstr[RAPI_BUFLEN]; // RAPI byte being read in
      int m_RAPIstrCount; //RAPI string counter

    public:
      RAPI();
      void Init();
     
      void flush() {
        Serial.flush();
      }
      void getInput();
      uint8_t getInt();
    };

    RAPI g_RAPI;

    RAPI::RAPI()
    {
      m_RAPIstrCount = 0;
    }

    void RAPI::Init()
    {
    g_RAPI.flush();

    }

    uint8_t RAPI::getInt()
    {
      uint8_t c;
      uint8_t num = 0;

      do {
        c = Serial.read(); // read the byte
        if ((c >= '0') && (c <= '9')) {
          num = (num * 10) + c - '0';
        }
      } while (c != 13);
      return num;
    }

    void RAPI::getInput()
    {
      if(Serial.available()) { // if byte(s) are available to be read
        m_RAPIinByte = Serial.read(); // read the byte
        Serial.print(char(m_RAPIinByte));
        digitalWrite(13, HIGH);
        if(m_RAPIinByte != 13) {
         m_RAPIinstr[m_RAPIstrCount] = char(m_RAPIinByte);
          m_RAPIstrCount++;
        }
        if(m_RAPIinByte == 13) {
          if (strcmp(m_RAPIinstr, "$ST 1") == 0){ //if match
            LAMP_STATE = 1;
             
          }
          else if (strcmp(m_RAPIinstr, "$ST 2") == 0) { // string compare
            LAMP_STATE = 2;
          }
         
          g_RAPI.flush();
          m_RAPIstrCount = 0; // get ready for new input... reset strCount
          m_RAPIinByte = 0; // reset the inByte variable
          digitalWrite(13, LOW);
          for(int i = 0; m_RAPIinstr[i] != '\0'; i++) { // while the string does not have null
            m_RAPIinstr[i] = '\0'; // fill it with null to erase it
          }
        }
    }
    }


    void setup() {
      pinMode(9, OUTPUT);
      pinMode(13, OUTPUT);
      Serial.begin(9600);
    }

    void loop() {
     
    {
    g_RAPI.getInput();
    }
     
      if(LAMP_STATE == 0) {
        digitalWrite(9, LOW);
      }
     
      if (LAMP_STATE == 1) {
        digitalWrite(9, HIGH);
      }
       if (LAMP_STATE == 2) {
      digitalWrite(9, LOW);
      }
    }
    Загружаю скетч, открываю последовательный порт и ввожу команды типа $ST 1 / $ST 2, но никаких действий не происходит, должен был загореться светодиод на 9 пине. На UNO во время ввода команды подмаргивает RX/TX. В чем проблема?
     
  2. Daniil

    Daniil Гик

    В свое время я так собирал строку по сериал порту:
    Код (C++):
    String inputString = ""; // a string to hold incoming data
    boolean stringComplete = false; // whether the string is complete

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

    void loop() {
      if (stringComplete) {
        boolean flagADC=false;
        boolean flagSweep=false;
        if (inputString.substring(0,1)=="!") {flagADC=true;  flagSweep=false;}  //ADC
        if (inputString.substring(0,1)=="?") {flagADC=false; flagSweep=true;}   //SWEEP
        inputString = inputString.substring(1,inputString.length()-1);
        if (flagADC)   {workADC();}
        if (flagSweep) {workSWEEP();}
        inputString = "";
        stringComplete = false;
      }
    }

    void serialEvent() {
      while (Serial.available()) {
        char inChar = (char)Serial.read();
        inputString += inChar;
        if (inChar == ':') {stringComplete = true;}
      }
    }
    Во входящей строке символ ":" означает конец строки, поэтому я его жду в serialEvent, поэтому же я его отрезаю в loope.
    SerialEvent это прерывание.

    ps. кажется, подсмотрено из примера)
     
    Последнее редактирование: 12 июн 2018
  3. parovoZZ

    parovoZZ Гуру

    А это обязательно решать силами ООП?
     
  4. AlexU

    AlexU Гуру

    Одна из проблем -- терминал, который используется на PC для отправки данных в последовательный порт, не отправляет символ новой строки (\n). В скетче символ новой строки используется как разделитель команд.