|
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 23
|
||||||
Потеря байт при записи данных из СОМ порта на SD карту27.03.2015, 09:08. Показов 3766. Ответов 14
Метки нет (Все метки)
Доброго времени суток!
Есть задача прочитать поток данных, поступающих из СОМ-порта. Данные сохраняются в файлы размером не более 1 МБ. При этом, чтобы имена файлов не повторялись, при формировании их имени осуществляется привязка к внутреннему времени, формируемому платой с микросхемой DS1302. Имя файла ММДДЧЧММ.dat (месяц-дата-часы-минуты). Программа нормально компилируется. Файлы с данными пишутся. Но есть проблема, которая состоит в том, что при чтении потока происходит потеря байт. Дело в том, что в поток внедрены метки, повторяющиеся через 6 байт (6 байт - длина кадра, информационной последовательности). По ним можно отследить пропуски кадров. Я вижу, что записываются 16-17 кадров (96-102 байт), потом идет пропуск до 32-34 кадров (150-160 байт). Потом данные опять записываются. Потом опять пропуск. Код скетча приведен ниже:
Не могу понять: то ли идет переполнение буфера, то ли нужно выставлять правильно таймеры. P.S.: Размер буфера варьировал. Не помогло.
0
|
||||||
| 27.03.2015, 09:08 | |
|
Ответы с готовыми решениями:
14
Поиск последовательности байт в массиве, приходящем из СОМ-порта
График данных СОМ-порта |
|
Модератор
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
|
|||
| 27.03.2015, 11:43 | |||
Сообщение было отмечено raxp как решение
Решение
0
|
|||
|
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 23
|
||||||
| 27.03.2015, 14:46 [ТС] | ||||||
|
vxg
У меня ж вроде стоит
Или я что-то недопонимаю?
0
|
||||||
|
Модератор
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
|
||
| 27.03.2015, 16:53 | ||
|
1
|
||
|
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 23
|
||||||
| 28.03.2015, 09:49 [ТС] | ||||||
|
vxg
Большое спасибо за подсказку. Увеличил объем массива со 100 до 256
P.S.: Тип данных изменил, т.к. принимаю численные значения. Хотя, как понял, конкретно для моей задачи это не критично.
0
|
||||||
|
0 / 0 / 0
Регистрация: 29.03.2015
Сообщений: 7
|
|
| 29.03.2015, 16:42 | |
|
я всегда когда пишу, делаю массив побольше, чтобы таких проблем не возникало)
0
|
|
|
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 23
|
|
| 29.03.2015, 21:33 [ТС] | |
|
dimape
Я уже сталкивался с подобной проблемой ранее, когда делал аналогичную прогу в MFC. Просто давно это было, вот и забыл
0
|
|
|
Модератор
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
|
|||||||
| 30.03.2015, 09:20 | |||||||
1
|
|||||||
|
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 23
|
|
| 30.03.2015, 14:23 [ТС] | |
|
vxg
ОК, спасибо. Потеря 1-2 пакетов не смертельна.
0
|
|
|
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
|
||
| 30.03.2015, 14:24 | ||
. Для безопасной трансляции данных между двумя очередями нужно использовать FIFO-буфер, и не факт что только один. Все операции копирования и записи тоже занимают время, соответственно, должны выполняться асинхронно. А раз асинхронно - значит со своими собственными буферами данных.У вас UART имеет свой собственный RX FIFO, который получает данные от приемника и отдает их функцией readBytes. Но! Что в момент вызова readBytes скопирует данные в некий буфер (в вашем варианте это вообще не сработает), а затем отдаст этот буфер на выполнение функции записи. Пока происходит запись, система UART'а должна иметь возможность принимать данные в уже освобожденный буфер, свой. Иначе произойдут коллизии.
0
|
||
|
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 23
|
|
| 30.03.2015, 21:12 [ТС] | |
|
И как тогда выкрутиться?
0
|
|
|
Модератор
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
|
||
| 31.03.2015, 09:20 | ||
|
проблема уйдет. поверьте. вызов Serial.readBytes скопирует байты в количестве меньшем или равном sizeof(data) из того самого первого страшного места о котором вы говорите в буфер, а вызов dataFile.write скопирует полученные байты из буфера в то самое второе страшное место о котором вы говорите. и пусть они там себе живут. я свечку не держал, но с вероятностью 100% могу утверждать что во время вызовов Serial.readBytes и dataFile.write никаких движений в тех самых страшных местах не происходит ибо это разрушит целостность данных и вообще помножит на ноль саму суть вызовов этих функций. как вариант - пока выполняются вызовы данные накапливаются в тех самых страшных местах, если будет переполнение вызов просто вернет ошибку или просто вышвырнет "лишние" данные - это зависит от реализации
0
|
||
|
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
|
||
| 31.03.2015, 09:39 | ||
|
я с ардуино не работал, могу дать только общие рекомендации.
1) Можно пытаться увеличить буфер RX для UART'а. 2) Возможно, не успевает контроллер. Увеличить частоту, если это возможно. 3) Проверить SD-карту. Поверьте, не все карты одинаково быстро пишут. Форматировать карту с увеличенным размером кластера. 4) Написать код на сях. Будет намного оптимальнее, т.к. тогда писать в файл можно будет напрямую, без промежуточных операций, которые в данной задаче только отнимают время. Добавлено через 18 минут Теперь главное чтобы все это успевало крутиться.
0
|
||
|
Модератор
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
|
||
| 31.03.2015, 11:54 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 27.05.2013
Сообщений: 23
|
|
| 31.03.2015, 13:13 [ТС] | |
|
Проверил первые записанные файлы (писали с три дня).
Потерь вроде нет (даже при переходе из файла в файл). Похоже, что, действительно, увеличение размера массива данных data помогло
0
|
|
| 31.03.2015, 13:13 | |
|
Помогаю со студенческими работами здесь
15
Прием данных с СОМ-порта Распознавание данных из СОМ-порта Чтение и обработка данных из СОМ порта Потеря данных при многопоточной записи в файл Драйвер чтения данных из СОМ-порта(Ассемблер) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|