SD-карта readline читает пакетные строки?

Итак, я пытаюсь передать данные с плавающей запятой через UART с моего Arduino на другую машину. Журнал этих данных действительно большой, поэтому я вынужден поместить его на SD-карту и прочитать его в Arduino построчно, а затем передать эту единственную строку.

Проблема в том, что мой код «захватывает» примерно 65 строк (или больше) за раз, передает их по UART, а затем останавливает (или дает сбой) Arduino.

Мой журнал выглядит так (небольшой фрагмент из нескольких тысяч строк):

14.71927
14.71795
14.71787
14.71787
14.71787
14.71799
14.7175
14.71836
14.71746
14.71787
14.71923
14.71878
14.7184
14.71791
14.71893
14.7184
14.71746
14.71799
14.71746
14.71795
14.71874
14.71795
14.71878
14.71836
14.71881
14.72235
14.72781
14.72872
14.72917
14.72826
14.73188
14.73278
14.73595
14.73783
14.74227
14.74231
14.74363
14.74683
14.7495
14.75492
14.75899
14.76396
14.76807
14.77033
14.77161
14.77262
14.77978
14.78524
14.7884
14.78746
14.79695
14.80238
14.80652
14.80648
14.81055
14.81191
14.81865
14.82234
14.82095
14.81733
14.8286
14.82908
14.82999
14.82682
14.83673

И мой код выглядит так (я знаю, что там написано 4 Гц, но это 1 Гц, но это должно было помочь "увидеть" "пакетный" захват и печать):

// Определяем выводы светодиода
#define greenLED    6
#define redLED      5

// Определяем нашу скорость последовательной передачи данных
#define BAUDrate    9600

// Чтение данных с SD-карты
#include <SD.h>

// Для печати данных на ЖК-панели
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd( 0x3F, 16, 2 );

void setup(){
    // Установить выводы светодиода в качестве выходов
    pinMode( greenLED, OUTPUT );
    pinMode( redLED, OUTPUT );

    // Выход светодиода при запуске: ЗЕЛЕНЫЙ = ВКЛ., КРАСНЫЙ = ВЫКЛ.
    digitalWrite( greenLED, HIGH );
    digitalWrite( redLED, LOW );

    // Начать проводную связь с платой MSP
    Serial.begin( BAUDrate );

    // Начинаем чтение данных с SD-карты
    SD.begin( 4 );                      // Нужен контакт № 4 для битового сдвига SD-карты
    File dataLog;                       // Сохраняем наши данные с SD-карты
    dataLog = SD.open( "DATA.TXT", FILE_READ );
    String data = dataLog.readStringUntil( "\n" ); // Прайминг наших данных

    int i = 0;

    while( data != "" ){
        i++;
        Serial.print( i );
        Serial.print( "\t" );

        Serial.println( data );         // Отправляем наши данные на плату MSP
        lcdUpdate( data );              // Печатаем наши отправленные данные на ЖК-экран

        delay( 1000 );                   // Ждем 1/4 секунды (4 Гц)

        data = dataLog.readStringUntil( "\n" );    // Повторяем наши данные
    }

    // Закрыть наш журнал данных, чтобы избежать повреждения содержимого SD-карты при перезапуске
    dataLog.close();

    // Переключаем наши светодиоды, так как мы закончили потоковую передачу наших данных
    digitalWrite( greenLED, LOW );
    digitalWrite( redLED, HIGH );
}

void loop(){
}

// Печатает текущие данные, отправляемые через UART, на ЖК-экран
void lcdUpdate( String ourData ){
    lcd.setCursor( 0, 0 );
    lcd.print( " Sending data:  " );
    lcd.setCursor( 0, 1 );
    lcd.print( "    " );
    lcd.print( ourData );
    lcd.print( "    " );
}

Опять же, я хочу, чтобы он взял одну строку, распечатал ее на последовательном терминале, распечатал на ЖК-дисплее, затем взял вторую строку и повторил. Я не могу проверить ЖК-дисплей (поскольку в данный момент у меня его нет), но последовательный терминал вызывает у меня проблемы, поэтому я предполагаю, что ЖК-дисплей тоже не будет работать.

Я получаю что-то вроде вывода последовательного терминала:

1       14.71927
14.71795
14.71787
14.71787
14.71787
14.71799
14.7175
14.71836
14.71746
14.71787
14.71923
14.71878
14.7184
14.71791
14.71893
14.7184
14.71746
14.71799
14.71746
14.71795
14.71874
14.71795
14.71878
14.71836
14.71881
14.72235
14.72781
14.72872
14.72917
14.72826
14.73188
14.73278
14.73595
14.73783
14.74227
14.74231
14.74363
14.74683
14.7495
14.75492
14.75899
14.76396
14.76807
14.77033
14.77161
14.77262
14.77978
14.78524
14.7884
14.78746
14.79695
14.80238
14.80652
14.80648
14.81055
14.81191
14.81865
14.82234
14.82095
14.81733
14.8286
14.82908
14.82999
14.82682
14.83

Кажется, он хочет остановиться где-то между 65-м и 69-м элементом случайным образом. Я предполагаю, что ему не хватает места в буфере, поскольку он захватывает все с SD-карты, а не по одной строке, по одной за раз.

Это стало более очевидным с моей строкой i = 0 и тем, что она повторяется не для каждой строки, а только один раз для ~65 строк.

Я неправильно считываю данные, или я неправильно их анализирую, или то, что я пытаюсь сделать, просто невозможно?

, 👍0

Обсуждение

поместите Serial.print("."); внутри блока loop(), @jsotola

@jsotola Он даже не доходит до блока loop (). Я сделал то, что вы сказали, и он просто останавливается, что подтверждает мои подозрения, что он захватывает все содержимое SD-карты и переполняет буфер, а затем зависает., @stillborn86


1 ответ


1

Справочник по Arduino не помогает с вашим вызовом readStringUntil (см. документацию по SD), но если предположить, что это то же самое как и Stream, ему нужен символ, а не строка в качестве терминатора.

Вывод показывает, что ваш Arduino пытался прочитать строку, но не было найдено ни одного конца строки — вероятно, из-за '' vs. "". Вот почему ваш вывод начинается с 1 (значение i), и после него нет других номеров строк, хотя в вашем выводе четко видны символы новой строки.

,