Почему серийные данные неполные, когда модуль 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.
@tries2tech, 👍0
Обсуждение0
Смотрите также:
- Отправка шестнадцатеричных данных последовательно и получение их обратно
- Как получить ненулевой выход из HX711 и ячейки загрузки?
- Как остановить серводвигатель в текущем положении при использовании последовательного порта? Я хочу, чтобы он оставался в одном положении при получении «0».
- Метод перебора битов в байте, отправленном по последовательному каналу.
- Считывание серийного номера с заголовком и конечным маркером
- Arduino Uno по-прежнему загружается и работает, но нет последовательной связи через USB
- Отправка строки с Arduino на ESP8266 работает на UNO, но не на Pro Mini
- Повреждение данных SoftwareSerial - поиск предложений
в чем конкретно проблема? ... чего вы ожидали? ... что на самом деле произошло?, @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