Обработка команд от SIM800

Тема в разделе "Arduino & Shields", создана пользователем Irinka, 27 окт 2019.

  1. Daniil

    Daniil Гуру

    Смотря какая цель. Все проблемы начинаются на высоких скоростях и при большом потреблении.
    я профессионально схватил ближайшие):cool:
    а праздник?
     
  2. Irinka

    Irinka Нерд

    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial SIM800(6,7);

      #define MAX_SIZE_BUF 100
      char inData[MAX_SIZE_BUF];
      uint8_t index;

    void setup() {
      Serial.begin(38400);
      SIM800.begin(38400);
    }



    void loop(){

    if (Serial.available())SIM800.write(Serial.read());

    if (SIM800.available() > 0) {
      char inChar;
        if(index < MAX_SIZE_BUF-1){
          inData[index] = SIM800.read();
          index++;
          inData[index] = '\0';
        }else{
         memset(inData,0,MAX_SIZE_BUF);
         index=0;
        }
    }



    if (index!=0){
      index=0;
      Serial.print(inData);
      memset(inData,0,MAX_SIZE_BUF);
      index=0;
    }






    }//loop
     
  3. DetSimen

    DetSimen Guest

    не так строку собирают добрые люди. Когда у тебя символы в SIM800 кончуцца available() перестанет быть больше нуля и inData сразуже обнулится. Думаю, ты не этого хотела.
     
  4. Irinka

    Irinka Нерд

    Не хотела, но не поняла, я обнуляю если буфер переполнен.
     
  5. DetSimen

    DetSimen Guest

    да, это я невнимателен. ну дак я паяю. Потом, если не буду плюшевый, посмотрю.
     
  6. Irinka

    Irinka Нерд

    Считываю ответы от сим800, всё ок, на первый взгляд быстрее чем с String
    Далее беда №1, хочу найти первый перенос строки, чуть-позже код выложу...
     
  7. Irinka

    Irinka Нерд

    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial SIM800(6,7);

      #define MAX_SIZE_BUF 100
      char inData[MAX_SIZE_BUF];
      uint8_t index;

    void setup() {
      Serial.begin(38400);
      SIM800.begin(38400);
    }


    byte i=0, num;
    char *uk1, *uk2, stemp[5];

    void loop(){

    if (Serial.available())SIM800.write(Serial.read());

    if (SIM800.available() > 0) {
      char inChar;
        if(index < MAX_SIZE_BUF-1){
          inData[index] = SIM800.read();
          index++;
          inData[index] = '\0';
        }else{
         memset(inData,0,MAX_SIZE_BUF);
         index=0;
        }
    }



    if (index!=0){
      index=0;
      Serial.print(inData);
      char *perenos = strpbrk(inData, "\r");
      Serial.print(perenos);
     
    memset(inData,0,MAX_SIZE_BUF);
    index=0;
    }

    При отправке АТ
    Скетч возвращает
    АТ
    ОК

    Позицию искомого символа \r мне не выводит Serial.print(perenos);




    }//loop
     
  8. parovoZZ

    parovoZZ Гуру

    а где зеркало?
     
  9. DetSimen

    DetSimen Guest

    Не. К сожаленью, мы с котом уже набубенились. Теперь только завтра.
     
  10. parovoZZ

    parovoZZ Гуру

    посуду сдал? Или безработным так много платят, что ещё и коту перепадает?
     
  11. Andycat

    Andycat Нерд

    функция наполнения буфера можно и попроще
    Код (C++):
    void loadDataFromModem() { // load data from modem to buf - only one line (string)
      if (Serial.available()) {
        byte br;
        while (Serial.available()) {
          br = Serial.read();
          if (br) {
            if (pos_buf >= (max_size_resp_buf - 1)) pos_buf = 0;
            resp_buf[pos_buf] = br; ++pos_buf;
            if (br == '\n') if ((pos_buf > 1) && (resp_buf[pos_buf - 2] == '\r')) break; // new string*/
          }
        }
        resp_buf[pos_buf] = 0; // stop byte of string
      }
    }

     
    а функция strpbrk и не возвращает позицию строки, можно вот так поиск подстроки сделать

    Код (C++):
    int strPos(char *str11, char *str22) { // find position substring in string
      char*p = LastPos(str11, str22);
      int n = p - str11;
      return n;
    }

    char* LastPos(char *str1, char *str2) { // find substring in string
      int L1 = strlen(str1);
      int L2 = strlen(str2);
      for (int i = L1 - L2; i >= 0; i--)
      {
        int j = 0;
        for (; j < L2; j++)
          if ((str1[i + j] != str2[j]))
            break;
        if (j == L2)
          return str1 + i;
      }
      return 0;
    }
     
     
  12. DetSimen

    DetSimen Guest

    у мня пасобие 11900 + я ремонтирую всякую старую советскую хрень, нам с котом хватает. :)
    (ну и плюс я еще 32 года назат удачно женился, теперь для аццкой сотоны я как чумадан без ручки, и тащить тяжело, и выбросить уже жалка. А теперь уже и дембель скоро).
     
    Последнее редактирование модератором: 31 окт 2019
  13. Irinka

    Irinka Нерд

    М-да... Много мне про char ещё нужно почитать...
    Может подскажите что почитать, где доступно разьяснено.
     
    Последнее редактирование: 31 окт 2019
  14. Irinka

    Irinka Нерд

    Char* хранится во флеш памяти и является неизменяемой констант ой?
     
  15. parovoZZ

    parovoZZ Гуру

    Про указатели читай.
     
  16. DetSimen

    DetSimen Guest

    если определишь как
    Код (C++):
    const char MyString1[] PROGMEM = "My string";
    то будет во флэш храница. Неизменяемой константой
     
  17. SergeiL

    SergeiL Оракул Модератор

    Так там читать можно долго.
    НужнО понимание об адресации в Си в целом.
    Эта вечная тема со строкой и ее адресом (вспомнился термин разыменование указателя). :)
    Раньше, у нас больше всего новичков пугали указатели на указатель, (а указатель на указатель на адрес функции это было просто кошмар) :)
     
    DetSimen нравится это.
  18. DetSimen

    DetSimen Guest

    а я када вижу указатель на указатель на адрес функции, возвращающей указатель на адрес функции, начинаю пить беспробудно дня три.
     
    Andrey12 и SergeiL нравится это.
  19. SergeiL

    SergeiL Оракул Модератор

    Вполне нормальная ситуация при выборе обработчика события :)
    Главное въехать :)
    Наверное пора ложиться спать.
    Четыре утра на дворе :)
     
  20. DetSimen

    DetSimen Guest

    а у меня бесдваццати двенаццать. :)