Вывод ответа на AT-запрос на дисплей

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

Метки:
  1. molodecblHok

    molodecblHok Нуб

    Здравствуйте, проблема следующая - имеется SIM900, Arduino Mega, обычный дисплей 2.4 "TFT LCD SHIELD" - все нормально работает в множестве программ, кроме описанной ниже.

    Отправляется запрос AT+COPS, ком-порт стандартно выдает построчно 6 пунктов (мобильные операторы и информация о MSC,MCC и далее), но вот дисплей в ответ на это показывает только четверть из ожидаемого материала и скетч просто продолжает работу, не зависает и не вылетает. Были попытки изменять delay, к успеху не привели. Шрифт роли не играет, помещались и бОльшие объемы данных. Идей нет уже абсолютно никаких, потому что аналогичные программы с запросами о координатах базовых станций, уровне сигнала и так далее работают идеально. Прикрепил изображения для наглядности - что происходит в ком порте (как должно) и что на дисплее. Буду благодарен любым идеям и комментариям.[​IMG]
    [​IMG]

    Код (C++):

    #include <SPFD5408_Adafruit_GFX.h>    // Core graphics library
    #include <SPFD5408_Adafruit_TFTLCD.h> // Hardware-specific library
    #include <SPFD5408_TouchScreen.h>
    #define LCD_CS A3 // Chip Select goes to Analog 3
    #define LCD_CD A2 // Command/Data goes to Analog 2
    #define LCD_WR A1 // LCD Write goes to Analog 1
    #define LCD_RD A0 // LCD Read goes to Analog 0
    #define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin
    #define  BLACK   0x0000
    #define MAGENTA 0xF81F
    #define WHITE   0xFFFF

    Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
    int switchPin = 22;
    int ledPin = 23;
    boolean lastButton = LOW;
    boolean currentButton = LOW;
    int ledOn = 0;
    int count=0;
    int pin = 24;
    volatile int state = LOW;

    void setup(void) {
      Serial1.begin(9600);
      Serial.begin(9600);
      tft.reset();
      tft.begin(0x9341);
      tft.setRotation(0);

    uint8_t rotation=1;
        tft.fillScreen(BLACK);
        tft.setRotation(rotation);
       unsigned long testText();
       tft.setCursor(0, 0);
      tft.setTextColor(WHITE);  tft.setTextSize(3);
      tft.println("Hello!");
      pinMode(switchPin, INPUT);
    pinMode(ledPin, OUTPUT);
    }

    boolean debounce(boolean last)
    {
      boolean current = digitalRead(switchPin);
      if (last != current)
      {
       
        current = digitalRead(switchPin);
      }
      return current;
     
    }

    void loop(void) {
    currentButton = debounce(lastButton);
      if (lastButton == LOW && currentButton == HIGH)
      {
        ledOn = ledOn +1;
      }
      lastButton = currentButton;
      digitalWrite(ledPin, ledOn);
      if(ledOn > 2) ledOn = 1;
     
    if (Serial1.available()) {
    int inByte = Serial1.read();
    Serial.write(inByte);
    }
    if (Serial.available()) {
    int inByte = Serial.read();
    Serial1.write(inByte);
    }
    switch(ledOn){
    case 1: {
    Serial1.println("AT");

        uint8_t rotation=1;
        tft.fillScreen(BLACK);
        tft.setRotation(rotation);
       unsigned long testText();
       tft.setCursor(0, 0);
      tft.setTextColor(MAGENTA);  tft.setTextSize(1);
       char s;              // переменная временного хранения данных
      if (Serial1.available()) // если в буфере есть что-то
      {
        delay(100);          //ждем 1 млс
        while (Serial1.available() > 0)  // выводим информацию, пока буфер не будет пустой
        {
          s=Serial1.read();              // получение данных (посимвольно)
            tft.print(s);          // вывод полученных данных (посимвольно)
            delay(10);
        }
    }
    delay(1000);
      break;
    }
    case 2:
    {
    Serial1.println("AT+COPS=?");
        uint8_t rotation=1;
        tft.fillScreen(BLACK);
        tft.setRotation(rotation);
       unsigned long testText();
       tft.setCursor(0, 0);
      tft.setTextColor(MAGENTA);  tft.setTextSize(1);
      tft.println("wait 5 min.");
      tft.println("All Mobile Operators:");
      delay(90000);
       char s;              // переменная временного хранения данных
      if (Serial1.available()) // если в буфере есть что-то
      {
        delay(100);          //ждем 1 млс
        while (Serial1.available() > 0)  // выводим информацию, пока буфер не будет пустой
        {delay(100);
          s=Serial1.read();              // получение данных (посимвольно)
          delay(100);
            tft.print(s);          // вывод полученных данных (посимвольно)
            delay(100);
        }
      delay(3000);
       }
      break;  
    }
    }
    }
     
  2. ну так строки-то кто переносить будет
     
  3. molodecblHok

    molodecblHok Нуб

    В других случаях, когда визуально тоже казалось, что в строчку просто не вмещается текст, он автоматически переносился на следующую и заполнял экран. Или я не так понял ваш комментарий?
     
  4. b707

    b707 Гуру

    на разных дисплеях это работает по разному. На каких-то само переносится, но в большинстве случаев надо в коде явный перенос делать
     
  5. molodecblHok

    molodecblHok Нуб

    Повторюсь, другие АТ команды, занимающие больше места выводятся полностью, плюс эта же команда большим шрифтом обрывается на том же месте независимо от положения конца строки на экране - на фото просто совпал обрыв с краем экрана. Нужны еще идеи кроме переноса.
     
  6. AlexU

    AlexU Гуру

    Есть предположение, что считываете данные с Serial1 медленнее, чем они приходят в порт. У Serial'а есть входной буфер, который принимает данные с интерфейса. Если буфер переполняется, то новые данные просто отбрасываются. Либо увеличивайте буфер, если память позволяет. Либо ускоряйте чтение и обработку данных.
     
    molodecblHok нравится это.
  7. molodecblHok

    molodecblHok Нуб

    Скорее всего дело именно в буфере, согласен. А есть какие-то наводки на решение через увеличение буфера либо скорости чтения и обработки? Не хватает мат.части для составления кода