Чтение из serial

Тема в разделе "Arduino & Shields", создана пользователем r0c, 6 мар 2022.

  1. parovoZZ

    parovoZZ Гуру

    Как, как? По счётчику.
    Заносишь в счётчик число равное количеству байтов, которое надо пропустить. На каждой итерации принятого байта (в прерывании, например), инкрементируешь счётчик. Как только досчитал до нуля - все следующие байты твои. И так до конца строки. Принял символ конца строки - сбрасываешь флаг начала пакета (или что там у тебя) и снова ждёшь новый пакет. Как только принял первые байты нового пакета, опять взводишь счётчик и алгоритм повторяется.
     
  2. SergeiL

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

    @parovoZZ не путай с прерываниями человека, пусть из loop() в цикле через Serial.read() вытаскивает, разницы то в его случае нет.
    А Serial и так через прерывания работает.
     
    DetSimen и b707 нравится это.
  3. b707

    b707 Гуру

    ну ведь уже раз пять подсказали - пропусти все ненужные байты в начале и потом читай свой. Что непорнятно?
    А насчет примера кода - неужели сами не осилите написать какой-нить цикл while с Serial.read() внутри?
    Стыдно должно быть такие примеры просить
     
  4. b707

    b707 Гуру

    +100 не нужны ему прерывания да и не осилит он их никогда даже с самым подробным примером.
     
  5. Рокки1945

    Рокки1945 Гуру

    Может так - попытка
    char incoming[127];//массив символов по уарту - не помню сколько там ограничение
    if (Serial.available() > 0)
    {for (i = 0; i < 128; i++) {incoming = Serial.read();//принимаем в первый байт массива первый приходящий байт}
    if (incoming == '9') - то считываем что там лежит
     
  6. r0c

    r0c Гик

    обязательно осилю. вот закончу школу и поступлю на программиста.
     
  7. r0c

    r0c Гик

    Можно попросить пример?
     
  8. r0c

    r0c Гик

    Здравствуйте! К сожалению не получилось оформить ваши мысли в работающий код. Можно попросить пример?
     
  9. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Инкремент - прибавление единицы. Отнимание единицы - декремент. Досчитать до нуля с положительными числами можно только декрементом.
     
  10. KindMan

    KindMan Гуру

    А что получилось? Хоть какой нибудь покажите.
    Вот, что у меня получилось:
    Код (C++):
    const int SkipNumber = 10; // Заносишь в счётчик число равное количеству байтов, которое надо пропустить.
    int BytesCount;
    const int ReqBytes = 5;    // Количество нужных байт из пакета
    bool ReqFlag;  // Принимаем или пропускаем данные

    void setup()
    {
      Serial.begin(115200);
      Serial.println("Start...");
      Serial.println("Skiped:");
    }
    void loop()
    {
      while (Serial.available())
      {
        char inChar = (char)Serial.read();
        BytesCount++; // На каждой итерации принятого байта инкрементируешь счётчик.
        Serial.print(inChar);
        if (ReqFlag)  // Если нужные данные то попадают сюда
        {
          if (BytesCount == ReqBytes) {
            BytesCount = 0;
            ReqFlag = false;  // сбрасываешь флаг начала пакета
            Serial.println("");
            Serial.println("Skiped:");
          }
        }
        else  // Ненужные пропускаем
        {
          if (BytesCount == SkipNumber)
          {
            BytesCount = 0;
            ReqFlag = true; // взводишь флаг нужного пакета
            Serial.println("");
            Serial.println("Needed:");
          }
        }
      }
    }
    Каждые 10 байт мы пропускаем, потом 5 принимаем.
     
  11. r0c

    r0c Гик

    Код (C++):
    static unsigned char i = 0;
    static char buff[60];
    void setup() {
      Serial.begin(9600);
    }
    void loop() {
      while (Serial.available() )
      {
        char inChar = (char)Serial.read();
        if (inChar == char(62))// если есть  символ  окончания">", обнуляем счетчик и выводим
        {
          Serial.print(buff);
          buff[i] = 0;
          i = 0;
        }
        else
          i++;
        if (i == 60)  i = 0;
        buff[i] = inChar;
      }
    }
    я делал несколько вариантов. но самый простой получился на примере из первых рекомендаций. Если учесть, что нужные байты находятся на 40-й позиции от конца . Создал маленький буфер и циклично его переписывал, пока не появится символ окончания ">". так в массиве размером buff[60] остается нужный байт из конца пакета. Правда, команда Serial.print(buff); в итоге выводит совершенно искаженный массив, совсем не в той последовательности, в которой он поступил
     
  12. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Наконец-то разродились. Вопрос - если пакеты фиксированной длины, значит и положение от начала фиксированное. Зачем тогда накапливать буфер ? Считывайте и игнорьте первые ненужные байты пока не дойдете до нужного адреса, считывайте нужное количество, остальное считывайте, но опять игнорьте. Это требуется для опустошения приемного буфера UART.
    Код (C++):

    int i=0; int y=0; int AddrStart = XX;; int buffLeng = YY; byte b;
    byte buff[buffLeng];
    void setup() {
      Serial.begin(9600);
    }
    void loop() {
      while (Serial.available() ) {
    b=Serial.Read();
    if( i > AddrStart && i < (AddrStart + buffLeng)) {
    buff[y] = b;
    y++; }
    i++; }
    i=0; y=0;
    ..........
    }
     
    как-то так.
     
    Последнее редактирование: 25 мар 2022
  13. r0c

    r0c Гик

    если ваш кода адаптировать, то не работает
    Код (C++):

    int i = 0; int y = 0;
    #define  AddrStart  5
    #define buffLeng  3
    //byte b;
    char buff[buffLeng];
    void setup() {
      Serial.begin(9600);
    }
    void loop() {
      while (Serial.available() ) {
        char b = (char)Serial.read();
        if ( i > AddrStart && i < (AddrStart + buffLeng)) {
          buff[y] = b;
          y++;
          Serial.print(buff);
        }
        i++;
         Serial.print(buff);
      }
      i = 0; y = 0;
      Serial.print(buff);
    }
     
  14. b707

    b707 Гуру

    в коде из #31 скобки вокруг блока else потеряны
     
  15. b707

    b707 Гуру

    не надо Serial вставлять где попало
    Нужно дождаться полного чтения нужных байт, добавить нулевой терминатор в буфер и только потом выводить его на печать
     
  16. r0c

    r0c Гик

    хоть где его ставь, все равно ничего не выводит
     
  17. b707

    b707 Гуру

    просто не умеете. Надо учиться.
    Вместо того чтоб просить "дайте примерчик", пробуйте писать сами. За тот месяц. что вы мучаете этот несчастный Сериал - могли бы гуру программирования стать
     
  18. r0c

    r0c Гик

    я пробую в свободное от школы время. К сожалению, не получается. Даже у гуру программирования не получается.
     
  19. b707

    b707 Гуру

    коды из #31 и #33 "почти рабочие", надо только мелкие ошибки исправить
     
  20. r0c

    r0c Гик

    #31 со скобками и без них- нет разницы