|
pishyk032
|
||||||
UART строка25.02.2014, 21:37. Показов 16588. Ответов 12
Метки нет (Все метки)
Здравствуйте уважаемые форумчане!
Имеются: 1)кривые руки 2)Microsoft Visual C# 2010 Express 3)CodeVision AVR 4)переходник USB>UART и ATmega 8 с обвязкой в виде светодиодов на ножках :) Недавно начал осваивать UART, и столкнулся с проблемой, что в регистр UDR залезает всего 1 байт. Допустим в вижуал си есть код
я подумал, и примерно сообразил как нужно с этим разобраться: со стороны компа нужно сначала разбить строку на байты, затем отправить стартовый байт, потом байты разбитой строки, потом стоповый байт. со стороны мк прием стартового байта, затем принять остальные байты которые потом сложить в одну строку, затем принять стоповой байт. бред? если да, скажите пожалуйста способ проще обмениваться не по 1 байту, а сразу несколько? |
||||||
| 25.02.2014, 21:37 | |
|
Ответы с готовыми решениями:
12
UART UART АЦП ->UART |
|
0 / 0 / 1
Регистрация: 27.01.2010
Сообщений: 3,435
|
|
| 26.02.2014, 00:47 | |
|
На верхнем уровне программы так может и казаться - что принимается/передается целиком строка, скажем, через вызов одной функции.
Но на самом деле все это разворачивается на нижнем уровне именно на побайтовую передачу. Например, функция передачи строки может выглядеть так: 0. Выделятся некий буфер - выходная строка. Или указатель на нее. 1. Настраивается прерывание на опустошение выходного байтового буфера UART - как буфер пуст (после передачи), то мы идем по указателю на следующий байт из выходной строки, и пытаемся передать этот следующий байт. Если байт-ноль (признак конца строки) - то стоп. 2. Пишется "верхняя функция" - типа send_uart(string) - в ней делается всего лишь назначение выходной строки на нужную строку и инициируется начало передачи (например, взводом прерывания, см. выше). В итоге, когда программа выполняет uart_send(string) - на самом деле все в прерывании делается незаметно, но об этом нужно помнить, что на это нужно время, и нельзя тут же посылать следующую строку. Кстати, ты путаешь понятия байт и бит - я так думаю по твоим словам "стартовый байт". Понятия "стартовый и стоповый" относятся к битам одного байта в UART. Рекомендую посмотреть на стартовой странице этого сайта учебный курс ДиХальта по AVR - там это все расписано, и про UART тоже.
0
|
|
|
pishyk032
|
||
| 26.02.2014, 01:10 | ||
p.s.: спасибо, обязательно прочту учебный курс) |
||
|
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
|
||||||
| 26.02.2014, 08:47 | ||||||
|
Достаточно писать в буфер по прерыванию. Вот рабочий код:
Как только встречается символ CR (0x0D), то флаг work становится 1, и уже можем спокойно проверять этот флаг в майне.
0
|
||||||
|
0 / 0 / 0
Регистрация: 08.02.2012
Сообщений: 648
|
|
| 26.02.2014, 16:23 | |
|
В C# так-же например в строчную переменную добавляешь получаемый байт, пока не попадется байт окончания данных, который собственно и говорит программе что от контроллера все получили, а теперь думай что с данными делать :-)
0
|
|
|
0 / 0 / 0
Регистрация: 14.02.2014
Сообщений: 80
|
|
| 26.02.2014, 18:36 | |
|
часто используется ключ конца команды - например /r/n(возврат каретки + переход на новую строку 0x10 0x13 в ascii вроде)
прибор записывает в буфер всю строку и после прихода /r/n начинается разбор буфера http://microsin.ru/content/view/1098/44/ - вот тут описан кольцевой буфер блин, Hotd тоже самое написал почти)
0
|
|
|
pishyk032
|
||
| 27.02.2014, 02:28 | ||
|
||
|
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
|
||
| 27.02.2014, 03:38 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 08.02.2012
Сообщений: 648
|
||||||
| 27.02.2014, 07:56 | ||||||
|
У компоненты "Serial Port" есть событие "DataReceived" которое вызывает функцию при получении одного или нескольких байт.
Код получается примерно такой:
0
|
||||||
|
0 / 0 / 0
Регистрация: 25.10.2010
Сообщений: 243
|
||
| 19.01.2017, 18:30 | ||
volatile unsykned char work=0; volatile unsykned char rx_buffer[RX_BUFFER]; ISR(USORT_RXC_vect) { unsykned char status,data; status=UCSRA; data=UDR; if ((status&((1<<FE)|(1<<PE)|(1<<DOR)))==0) { if (data==10) // CR { work=1; } else rx_buffer[rx_index]=data; if (++rx_index == RX_BUFFER) rx_index=0; } } в майне: if (work) { work=0; //обрабатываем нашу строку как хотим. } Алгоритм - есть массив rx_buffer. При приеме каждого нового байта, мы пишем этот байт в его ячейку, и сдвигаем счетчик на 1. Как только встречается символ CR (0x0D), то флаг work становится 1, и уже можем спокойно проверять этот флаг в майне. rx_index - откуда он взялся?
0
|
||
|
0 / 0 / 0
Регистрация: 14.05.2015
Сообщений: 65
|
|||||||||||||||||||||
| 23.01.2017, 14:06 | |||||||||||||||||||||
|
Доброго дня!
Я мучаюсь с UART - недавно решил его попробовать освоить. Получилось нормально прочитать и разобрать, сейчас пытаюсь отправить данные. В связи с этим столкнулся с проблемой отправки строки и с непонятными warning-ами. Подскажите, пожалуйста, в чем может быть проблема? МК Atmega88, тактируется от собственного 8 МГц, проверяю сейчас на реальном МК и программой Terminal v1.9b by Br@y++. Пишу в AtmelStudyo 6.2 SP2 Один символ отправляется нормально, поэтому на инициализацию я не грешу, но код её всеж предоставлю. Инициализация UART:
Её вызываю следующим образом: UART_send_ch("e"); И при компиляции студия выдаёт warning: pointer targets in passing arkument 1 of "UART_send_ch differ in syknedness [-Wpointer-sykn] И такой message: expected unsykned char * but arkument is of type char * Что это за warning? Что мне надо изменить, что бы избавиться?
<Изображение удалено>
0
|
|||||||||||||||||||||
|
0 / 0 / 0
Регистрация: 26.01.2009
Сообщений: 3
|
|||||||||||||
| 23.01.2017, 15:03 | |||||||||||||
На самом деле у тебя в обоих функциях по лишнему уровню указателей:
0
|
|||||||||||||
|
0 / 0 / 0
Регистрация: 14.05.2015
Сообщений: 65
|
|
| 23.01.2017, 15:56 | |
|
Спасибо большое, div!
Заработало!
0
|
|
| 23.01.2017, 15:56 | |
|
Помогаю со студенческими работами здесь
13
UART<->SPI UART на ATtiny2313 UART в Xmega ик-avr-uart UART (ATMega328) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|
|
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ *
Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях.
Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её.
Последовательность действий:. . .
|
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
|
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение.
И на уровне агентов добавится между грибами или бактериями взаимодействий.
До того я пробовал подход через многомерные массивы,. . .
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|