Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/19: Рейтинг темы: голосов - 19, средняя оценка - 4.89
4 / 4 / 1
Регистрация: 20.04.2011
Сообщений: 141

ARM11. Потеря данных при приеме UART-ом

18.06.2013, 11:58. Показов 3921. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Для передачи использую интерфейс UART, проц ARM11. Есть входной FIFO глубиной 32.
Ставлю уровень заполнения FIFO и прерывание по этому событию. В прерывании считываю всю FIFO и провожу необходимый мне анализ данных. Обработчик по времени очень короткий.

Так вот при передаче пакетов размером примерно до 60 байт все нормально принимается и читается.
При передаче пакетов больше 60 байт в буфер FIFO почему-то попадают только первые 60 байт! То есть я их считываю как обычно, а после этого FIFO остается пустой, а куда делись остальные байты???

При чем возможно два сценария: установился флажок OVERRUN либо НЕ установился. В случае OVERRUN я еще могу понять - настолько быстро приходят байты, что даже с коротким обработчиком и глубоким буфером мы их не успеваем забрать.
Но что происходит если никаких ошибок не возникало? Как UART "прозевал" последущие байты, почему не появилось новое прерывание по уровню FIFO?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.06.2013, 11:58
Ответы с готовыми решениями:

Прерывание таймером при приёме и передаче данных через UART
Разрабатываю программу для RS485 на базе контроллера STM32F100xx. Ступор настал когда нужно входные и выходные данные прерывать по таймеру...

STM32F103 UART лишний байт данных при приеме ломает все
Всем привет! Пришлось взять STM32F103 (терпеть не могу эту линейку, но было без вариантов). Итак частота проца 72 МГц, скорость по USART...

UART проблема при приеме данных. ATmega128A
Добрый день. В программировании микроконтроллеров навичек. Столкнулся со следующей проблемой и залип на несколько дней. В качастве...

10
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
19.06.2013, 11:38
...вопрос слишком общий. Без общей картины сложно определить как работает ваша система, какие нагрузки и т.д.
Но я бы проверил следующее:
1) Приоритеты прерываний UART'а. Поставьте их по-выше, возможно, какое-то другое прерывание забивает вызовы прерываний по УАРТу и таким образом, не дает работать.
2) Отключите парсинг, посчитаете (и выведите) просто количество принятых байт из FIFO.
3) Проверьте по ДШ процессора - нужно ли сбрасывать флаги заполнения FIFO и другие в прерываниях. Возможно, нужно, а вы их не сбрасываете.

ЗЫ: ну, и без фрагментов исходников, конкретного названия чипа и других подробностей это просто "гадание на кофейной гуще", сами понимаете. Специфика есть в каждом АРМе.
0
61 / 186 / 31
Регистрация: 14.02.2013
Сообщений: 1,695
19.06.2013, 18:00
Может какую нибудь переменную не обнуляешь.
0
487 / 333 / 33
Регистрация: 15.08.2011
Сообщений: 1,078
20.06.2013, 12:04
Цитата Сообщение от Voland_ Посмотреть сообщение
ЗЫ: ну, и без фрагментов исходников, конкретного названия чипа и других подробностей это просто "гадание на кофейной гуще",
Я кажется уже догадался. Это raspberry pi Но тогда этот вопрос надо в раздел Linux было отсылать.
0
4 / 4 / 1
Регистрация: 20.04.2011
Сообщений: 141
20.06.2013, 12:54  [ТС]
Цитата Сообщение от paskal Посмотреть сообщение
Я кажется уже догадался. Это raspberry pi Но тогда этот вопрос надо в раздел Linux было отсылать.
Как ты догадался что это распбери пи? )))
На самом деле это не распбери пи.

В общем основная идея проблемы: когда прерывание настроено на срабатывание по какому-то уровню заполнения FIFO, то если у нас остаются байты несчитанные меньше уровня срабатывания - мы про это не знаем.
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
20.06.2013, 13:08
Цитата Сообщение от tiger() Посмотреть сообщение
то если у нас остаются байты несчитанные меньше уровня срабатывания - мы про это не знаем.
глубина мысли поражает, но я ничего не понял %).
0
4 / 4 / 1
Регистрация: 20.04.2011
Сообщений: 141
20.06.2013, 13:30  [ТС]
Цитата Сообщение от Voland_ Посмотреть сообщение
глубина мысли поражает, но я ничего не понял %).
)))

Прерывание срабатывает когда, например, буфер FIFO заполнился на половину (этот уровень можно настраивать). Когды мы вышли из обработчика и если нам пришло еще байт меньше чем половина FIFO прерывание не сработает и мы даже не узнаем о том что там что-то есть пока не придет очередной пакет и уровень превысится. Но когда придет следующий пакет, очевидно, это будет уже не актуально.
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
20.06.2013, 13:35
TC, выкладывайте проект, гадать никто не будет.
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
20.06.2013, 13:44
tiger(), да ))). Теперь понял. Просто вам тогда не подходит данный алго. Создайте прерывание по RXNE (по приему каждого символа). и анализируйте на полноту принятого пакета. А прерывание по заполнению FIFO (или еще в DMA есть такое) и не используется для анализа - это дает возможность работать с потоками данных (перенаправлять их через DMA), а не отдельными пакетами.
0
4 / 4 / 1
Регистрация: 20.04.2011
Сообщений: 141
20.06.2013, 14:51  [ТС]
DMA в этом проце невозможно подцепить к уарту, там есть строгая привязка всех каналов DMA к конкретным функциям.
А у меня срабатывание по уровню просто дает меньше прерываний, а значит меньше перегружает процессор.
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
20.06.2013, 15:24
Цитата Сообщение от tiger() Посмотреть сообщение
есть строгая привязка всех каналов DMA к конкретным функциям
так оно в большинстве АРМов так и есть. Просто определенный канал DMA может принимать запросы и управляться от UART'а. Некоторые каналы можно "двигать" программно, а значит это можно делать из прерывания, тем самым реализуя логику прямой передачи memory_2_memory.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.06.2013, 15:24
Помогаю со студенческими работами здесь

Потеря части больших данных при приёме через recv
Есть небольшой сервер на C++ кросплатформенный с поддержкой SSL (там собстно 2 порта ssl и без него), на неблокирующих сокетах epoll,...

какая то черная магия при приеме по UART
Вообщем принимаю я две строки по UART, в блок switch все нормально приходит, первая строка "АТ", вторая "ОК". И вот...

Ошибка при приёме данных
На скрине ошибка, из за чего она и как исправить? Делал чат и при отправке сообщения такая ошибка

Зависает при приёме больших данных
не могу разобраться что я делаю с потоком входящих данных не так, при входе большого колличества данных цикл уходит на второй круг и...

QTcpServer, тормозит при приёме данных
Есть простейший сервер, который включается по команде старт void start(uint64_t port){ connect(tcpServer, SIGNAL(newConnection()),...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru