|
|
  |
Прием данных USART, пропускаю данные из за переполнения |
|
|
|
Jan 19 2012, 15:07
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Про синхронизацию
Из того материала, что Вы предоставили, действительно, не видно, как осуществляется синхронизация между принимающим и передающим устройствами. Вероятно, синхронизация отсутствует вовсе...
Как, вероятно, происходит работа устройств сейчас: 1. Вы включаете приёмное устройство (подаёте на него питание). МК начинает работать. Производится инициализация устройств МК (таймера, USART). Передаётся управление функции READ_MASS_RS_1. Она (функция) взводит прерывание от таймера (прерывание наступит через какое время? "...много больше чем требуется на передачу пакета". Это сколько? Секунда? Две? 10?), и ждёт приема N байтов... 2. В это время Вы набираете (?) некие символы на терминале (на терминале ли?) и нажимаете (?) кнопку "отправить" (??? В этом пункте сплошные вопросы из-за отсутствия информации...). 3. П.2 занимает у Вас некоторое время. 4. Вполне вероятно, что это время больше, чем величина тайм-аута. 5. МК по тайм-ауту прекратил приём байтов (вероятно, ещё до того, как Вы отправили все данные). 6. ... что происходит далее - сказать нельзя из-за отсутствия информации...
|
|
|
|
|
Jan 19 2012, 15:42
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
А модно дилетанту встрять? Если я правильно вас понял, вы по каким-то причинам не используете прерывания USART по приему, а просто опрашиваете его с определенной частотой по таймеру? Мне это напоминает анализ нажатия кнопок без прерываний по уровням на ногах, а с таким же "опросом клавиатуры" с определенной частотой. Так и опрашивайте USART всегда. Вообще всегда, и пусть ваш основной процесс крутится параллельно, а по таймеру вы заглядываете, не пришел ли очередной байт - ведь режим асинхронный. И не надо ничего ни с чем синхронизировать, а только складывать байты в мешок, можно кольцевой  А если вы асинхронно приходящие байты наделяете каким-то человеческим смыслом, мыслите в терминах "пакетов" и прочих условностей, тогда и сами эти "пакеты" лучше формировать как надо - с детерминирующими символами, определяющими начало и конец пакета, часто используются enter|return как детерминирующий конец. И тогда передающее устройство пусть хоть какие паузы делает в процессе передачи и между пакетами - вы их примете и обработаете нормально. Но не будете определять "конец пакета" по тому факту, что "то символы летели один за другим, а то у нас что-то долго ничего не приходит, значит наверное конец пакета". Или я не правильно понял вашу логику "пакетов"?
|
|
|
|
|
Jan 19 2012, 16:20
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
Цитата опрашивать USART всегда ен могу. Нужно еще обрабатывать принятое Либо вы меня не поняли, либо одно из двух  Сколько тактов у вас уйдет на разовый опрос USARTа? Правильно, мизер. И с точки зрения основной программы, у вас будет лежать где-то мешок, куда "сами собой" будут сыпаться принятые байты - и этой основной программе будет все равно как они туда сыпятся - по прерываниям от USART или по прерываниям от таймера его опрашивающего. А как придет байт конца "пакета" - тогда либо выставляется флаг "посылка пришла", либо вы выходите из спячки и начинаете обрабатывать принятое, а параллельно у вас принимается следующий пакет. И не надо "все бросать" и сидеть и ждать, когда же примется вся посылка, а потом что-то делать. И ещё - если вы не успеваете "обрабатывать принятое" при той скорости входящего потока, которую выдает ваше передающее устройство, то вас не спасут ни прерывания ни опрос ни вообще ничего.
|
|
|
|
|
Jan 20 2012, 15:43
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(messenger @ Jan 20 2012, 18:39)  если ее же послать в момент паузы т.е до прихода Х то с МК что то происходит и он шлет пустой буфер zzzzzzzzz.. Объяснить такое поведение программы - можно: 1 выполнение программы не дошло до функции READ_MASS_RS_1; 2 байты по USART доходят до МК, но программа их из UDR не "выгребает"; 3 фиксируется DOR и RXC; 4 как только МК начинает выполнять READ_MASS_RS_1, то "замечает", что байт принят USART и забирает его, но по DOR в буфер не помещает; 5 дальше МК ждёт прихода следующего байта, не ничего не дожидается (все байты уже были переданы) и выходит из READ_MASS_RS_1 по тайм-ауту Как это исправить? Трудный вопрос... Уж так Вы спроектировали Вашу программу, что без кардинальной переделки вряд-ли это возможно...
|
|
|
|
|
Jan 20 2012, 16:25
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(messenger @ Jan 20 2012, 19:52)  значит я правильно понял где ошибка, но почему нельзя флаги ошибки перед началом приема просто сбросить? Флаги-то сбросить можно... Но, все байты были благополучно отправлены до того, как их прихода ждал МК и, поэтому не забрал из UDR. Цитата A data overrun occurs when the receive buffer is full (two characters), it is a new character waiting in the Receive Shift Register, and a new start bit is detected. Если на вход USART пришло 6 байт - куда "бедному" устройству их "складывать"?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|