Почему серийные данные неполные, когда модуль SD-карты открыт?

Я пытаюсь прочитать последовательные данные из модуля VectorNav и сохранить их на SD-карту. Я ожидал, что это будет относительно просто, и смог сделать это на Python на Pi, но не на Arduino, который я использую. Ниже приведен код, который я использую.

#include <SD.h>

File dataFile;

void setup() {
    const int chipSelect = 10;
    Serial.begin(115200);
    if (!SD.begin(chipSelect)) {
      Serial.println("initialization failed!");
    }
    Serial.println("initialization done.");
    
}
void loop() {
    dataFile = SD.open("trial.txt", FILE_WRITE);
    if (Serial.available())
        //dataFile.print((char)Serial.read());
        Serial.print((char)Serial.read());
        dataFile.close();
}

Когда я комментирую SD.open и dataFile.close, я вижу последовательные данные именно то, что мне нужно. Однако всякий раз, когда эти две строки включены, отображается только первая половина сообщения или около того. Я определил, что SD-материал путается с последовательными данными, но не могу понять, почему.

Мой вывод должен выглядеть так:

14:45:27.284 -> $VNYMR,-094.047,+000.222,-000.269,-00.0411,+00.5411,+00.6431,+00.014,+00.051,-09.462,+00.000114,+00.004274,-00.000511*60
14:45:27.317 -> $VNYMR,-094.047,+000.222,-000.269,-00.0388,+00.5411,+00.6469,+00.057,+00.062,-09.442,-00.000458,+00.000267,-00.000621*62
14:45:27.317 -> $VNYMR,-094.047,+000.224,-000.269,-00.0412,+00.5400,+00.6431,+00.036,+00.013,-09.465,-00.000930,+00.004784,-00.000986*64

Но вместо этого выглядит

14:38:17.487 -> $VN33$VN.0$VN90$VN5,$VN+0$VN10$VN02$VN2.$VN0+$VN,5$VN0-$VN,0$VN.+$VN95$VNM0
$VN31$VN00$VN,0$VN.4$VN+0$VN.,$VN07$VN2.$VN0-$VN29$VN0-$VN2.$VN.+$VNR.$VNY+6$VN67$VN00$VN4-$VN00$VN2.$VN0-$VN,0$VN00$VN,4$VN2.$VN05$VN10$VN94$VN,.$VNY7*$VN61$VN00$VN4+$VN+0$VN3.$VN-1$VN,0$VN00$VN,6$VN0-$VN08$VN90$VN92$VNM0
14:38:18.958 -> $VN0*$VN.0$VN+.$VN.4$VN,0$VN40$VN08$VN80$VN0+$VN94$VN.0$VN,0$VN90$VNR.$VNM0
14:38:19.331 -> $VN40$VN.0$VN4,$VN58$VN,0$VN40$VN,0$VN80$VN0,$VN94$VN0-$VN4.$VN.+$VN03$VNY+0$VN40$VN00$VN00$VN03$VN4.$VN0,$VN-3$VN.0$VN0,$VN.0$VN0-$VN2.$VN3+$VNM0
$VY+1$VN64$VN+0$VN58$VN06$VN20$VN.,$VN00$VN00$VN,3$VN29$VN+3$VN90$VN05$VNR0
14:38:20.433 -> $VN39$VN00$VN00$VN52$VN,0$VN40$VN,0$VN70$VN0,$VN14$VN09$VN,4$VN.+$VN-0$VNY,6$VN49$VN+0$VN00$VN01$VN4.$VN.,$VN-4$VN.0$VN-6$VN29$VN0,$VN10$VN95$VNR0
14:38:21.166 -> $VN,6$VN.0$VN+.$VN.3$VN00$VN10$VN06$VN2.$VN00$VN34$VN.0$VN70$VN10$VN03$VNR0

Недостаточно памяти? Я использую Elegoo UNO R3. Последовательные данные — это UART.

, 👍0

Обсуждение

в чем конкретно проблема? ... чего вы ожидали? ... что на самом деле произошло?, @jsotola

@jsotola отредактировал вопрос, чтобы показать ожидаемый и фактический результат. Проблема в том, что когда открытие и закрытие SD закомментировано, последовательные данные выглядят как в первом примере, но когда они включены, что-то идет не так (не знаю, из-за чего) и вместо этого выглядит как показанное второе поле., @tries2tech

попробуйте это... откройте файл в setup()... в цикле() сохраните 100 полученных символов (считайте их)... затем закройте файл... это имеет значение?, @jsotola

Serail.read() не читает данные с SD-карты, а читает с серийного номера. Чтобы прочитать данные с SD-карты, это должно быть dataFile.read()., @hcheung

Также, когда вы читаете данные с SD-карты, используйте атрибут FILE_READ вместо FILE_WRITE. В общем, постарайтесь понять, что делает файл, или прочитайте документацию, прежде чем писать код., @hcheung

@hcheung серийные данные поступают из модуля VectorNav, @jsotola

@jstola я добавил в то время как (strlen (сбор) <75) сбор += ((char)Serial.read()); Serial.println(сбор); Это привело только к тому, что последовательный монитор показывал очень странные данные после ввода последовательного контакта, и он продолжал делать это, когда я отключал последовательный порт., @tries2tech