| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
Несчастный УАРТ
08.02.2011, 00:12
|
|
|
Частый гость
Регистрация: 19.10.2009
Сообщений: 11
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Несчастный УАРТ
Хорошо давайте с начала.
У меня есть устройство. Мне надо сделать запрос 01 A1, оно мне отвечает пакетом в 30 байт весь пакет мне не надо. Нужны данные с 15 по 21 байт включительно.
Запрос делаю так:
|
Код:
|
ldi resive,01
rcall uart_snt
ldi resive,A1
rcall uart_snt
........
uart_snt:
sbis UCSRA,UDRE
rjmp uart_snt
out UDR, resive
ret |
Получаю пакет 0D 0E 01 02...........15 16 17 18 19 20 21............35 36.
Как правильно обработать? У меня как писал выше прием идет. Только если пакет приходит ровно 38 байт, то проблем нет. А если мой контролер получает на байт меньше или на байт больше, то тут и проблема. Можно конечно ждать начало в моем случае 0D 0E и от него скакать, а как еще и конец обрезать, чтобы обрезать и получать ровно 38 байт? Как сформировать RX Complete?
|
|
|
|
08.02.2011, 00:36
|
|
|
Прохожий
Регистрация: 06.02.2011
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Несчастный УАРТ
Сообщение от jakuchma
|
Хорошо давайте с начала.
У меня есть устройство.
...
|
А Вы знаете, что такое конечный автомат или машина состояний?
От Вашего ответа на этот вопрос зависит дальнейшая помощь.
|
|
|
|
08.02.2011, 00:59
|
|
|
Частый гость
Регистрация: 19.10.2009
Сообщений: 11
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Несчастный УАРТ
Не, не, не. Я не ракету запускаю, мне по боку что получет контролер. Он всего лишь температуру читает причем довольно таки быстро. И если получит мусор какой, то ничего страшного. Главное чтоб контролер не завис. Получил свои 38 байт и больше не ждал, я их уже обработаю сам.
|
|
|
|
08.02.2011, 00:59
|
|
|
Гражданин KAZUS.RUN
Регистрация: 14.11.2008
Сообщений: 701
Сказал спасибо: 298
Сказали Спасибо 283 раз(а) в 193 сообщении(ях)
|
Re: Несчастный УАРТ
Вы можете создать на приёмной стороне буфер, байт 60, и записывать туда принятые байты не разбираясь, затем в буфере найти свой маркер OD OE и от него уже считать.
А Вы уверены, что в Вашей посылке не будет другого OD OE кроме маркера?
|
|
|
|
08.02.2011, 01:17
|
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
|
Re: Несчастный УАРТ
Сообщение от jakuchma
|
|
Получил свои 38 байт и больше не ждал, я их уже обработаю сам.
|
1) Принимаете по прерыванию, в нем же сбрасываете счетчик. В теле программы счетчик инкременируете. Когда счетчик переполнился - значит все данные приняты, пора разбирать.
2) Лучше запустить это все на втором прерывании по таймеру.
3) А еще лучше, второе прерывание поднимает флаг, что пора инкременировать счетчик. В теле работаете с флагами. Если флаг поднят, работаете с его процедурой т.е. инкременируете счетчик, проверяете переполнение, выходите.
В последнем случае можно выполнять больше 10 задач одновременно.
|
|
|
|
08.02.2011, 01:18
|
|
|
Частый гость
Регистрация: 19.10.2009
Сообщений: 11
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Несчастный УАРТ
да именно 0D 0E, и если я читаю весь, пакет почему нельзя писать в память именно то, что нужно?
|
|
|
|
08.02.2011, 02:00
|
|
|
Частый гость
Регистрация: 19.10.2009
Сообщений: 11
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Несчастный УАРТ
Сообщение от Easyrider83
|
|
1) Принимаете по прерыванию
|
мне всего то и надо как на ассемблере принять по прерыванию?
|
|
|
|
08.02.2011, 02:03
|
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
|
Re: Несчастный УАРТ
Сообщение от jakuchma
|
|
как на ассемблере принять по прерыванию?
|
понятия не имею 
на асме пишу только короткие вставки, когда в этом есть необходимость
|
|
|
|
08.02.2011, 02:30
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
|
Re: Несчастный УАРТ
Сообщение от Easyrider83
|
|
на асме пишу только короткие вставки, когда в этом есть необходимость
|
и то для PIC. Это AVR.
Сообщение от jakuchma
|
|
мне всего то и надо как на ассемблере принять по прерыванию?
|
А вот тут язык программирования не важен. Логика работы одинакова.
Сообщение от jakuchma
|
|
почему нельзя писать в память именно то, что нужно?
|
Почему нельзя? Кто запретил-то?
- Есть время приёма пакета? Значит организуете TimeOut.
- Есть маркер начала пакета? Значит известен номер байта от начала. Известна длина информационной части.
переменные:
1.счетчик принятых байтов.
2.байт хранения предыдущего принятого байта.
3.Буфер для приёма 7ми информационных байтов.
4.Флаг старта приёма полезной информации.
5.Флаг окончания приёма.
6.Счётчик для отсчёта Таймаута. Таймер для собственно отсчета.
По прерыванию проверяете, который по счёту вход, если первый запускаете отсчёт таймаута.
Ждете прихода маркера начала приёма - "0D 0E". Для этого и нужен(2.байт хранения предыдущего принятого байта.)
Пропускаете все ненужные байты до 15.
Принимаете в буфер информационную часть. Ставите флаг окончания приёма.
Пропускаете всё остальное до таймаута. По нему сброс всех переменных и флагов.
Если таймаут случился до установки флага окончания приёма - значит посылка ошибочна.
Примерно так. Кодируйте.
|
|
|
|
08.02.2011, 02:46
|
|
|
Гражданин KAZUS.RUN
Регистрация: 16.06.2005
Сообщений: 942
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
|
Re: Несчастный УАРТ
Сообщение от jakuchma
|
|
да именно 0D 0E,
|
А если посмотреть на реальное содержимое пакета (что-то мне подсказывает, что там будут байты от 0х20 и выше) и немного подумать, то скорее всего окажется, что 0х0Е это маркер начала пакета, а 0x0D это конец пакета.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:44.
|
|