77 / 77 / 11
Регистрация: 02.12.2011
Сообщений: 296
|
||||||
1 | ||||||
Формирование пакета данных для передачи по UART14.06.2015, 09:43. Показов 7376. Ответов 18
Метки нет (Все метки)
...доброго времени суток, уважаемые форумчане! Возник вопрос: имеется ли в CodeVisionAVR 1.25 для ATmega8 тип данных эквмвалентный AnsiString в C++?
Если - да, то как он называется и какую библиотеку нужно подключить? Если - нет, то как сформировать такой пакет для передачи (на языке Си): <число[int]> + <' '[пробел - как разделитель]> + <число[int]> + <' '[пробел - как разделитель]> <число[int]>; тип данных - char или unsigned char. В частности, на C++ это решается очень просто:
0
|
14.06.2015, 09:43 | |
Ответы с готовыми решениями:
18
Сжатие данных для передачи по UART Софтварный uart на tiny 26. Частота передачи данных. Выбор сетевого адаптера для передачи UDP пакета Отправка пакета URB для ИЗОХРОННОЙ передачи в коде драйвера Перевод массива из 16 битной в 8 битную систему для передачи в UART в MPLAB |
77 / 77 / 11
Регистрация: 02.12.2011
Сообщений: 296
|
|||||||||||
14.06.2015, 18:01 [ТС] | 3 | ||||||||||
ValeryS, большое спасибо! действительно забыл про эту функцию: вот, что значит "хронически" пользоваться Visual Studio и Borland C++ Builder Сделал так:
И еще вопрос: а как решить обратную задачу, т. е. "разобрать" принятую строку (формат и структура данных такие же)? В билдере эта задача решается элементарно:
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
|
14.06.2015, 18:22 | 4 |
а примерно так же
есть функция sscanf http://lord-n.narod.ru/downloa... sscanf.htm Добавлено через 2 минуты проблема может быть в printf, как он реализован? через UART? скорость обмена какая?
1
|
77 / 77 / 11
Регистрация: 02.12.2011
Сообщений: 296
|
||||||
14.06.2015, 18:32 [ТС] | 5 | |||||
...да, UART; скорость - 9600... вот инициализации:
0
|
77 / 77 / 11
Регистрация: 02.12.2011
Сообщений: 296
|
|
14.06.2015, 18:52 [ТС] | 7 |
... т. е. до реализации в "железе" считать подтормаживание нормальным явлекнием?
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
|
14.06.2015, 19:03 | 8 |
не могу сказать, может и протеус сам тормозить это же эмулятор , может и винда, это все таки многопоточная система
смотри не на реальный отклик а на циферки внизу, они более точное время показывают
1
|
77 / 77 / 11
Регистрация: 02.12.2011
Сообщений: 296
|
|
14.06.2015, 19:16 [ТС] | 9 |
... и еще вопрос: не смогли бы Вы привести фрагмент кода по "разборке" строки и записи выделенной части в виде числа int?.. уже ничего не соображаю...
0
|
77 / 77 / 11
Регистрация: 02.12.2011
Сообщений: 296
|
|
14.06.2015, 19:47 [ТС] | 11 |
.... принимается с UART; тип данных - unsigned char; строка такая <число от 0 до 255; преобразовано из int><пробел; служит разделитлем><число от 0 до 255; преобразовано из int><пробел; служит разделитлем><и т. д.>
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
||||||
14.06.2015, 19:55 | 12 | |||||
ну попробуй так
скорми эту строку компилятору для большого компа и проверь, я часто так делаю когда сомнения возникают а зачем тебе int чем unsigned char не угодил ? учти что 8битки для сложения вычитания Интов привлекают свои библиотеки, очень часто это тормозит
1
|
77 / 77 / 11
Регистрация: 02.12.2011
Сообщений: 296
|
|
14.06.2015, 20:15 [ТС] | 13 |
...в контроллер передаются два числа: одно для выбора режима - то ли "if - else if - else", то ли "switch-case" (посмотрю), а второе - хочу в цикле сформировать пачку импульсов для этого девайса (цифровой резистор)
0
|
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
|
14.06.2015, 21:53 | 14 |
на скорости 256к у вас 25к прерываний в секунду, для получения нового байта данных из буфера в УАРТ. Соответственно, может уже и подтормаживать. Советую использовать выполнение функций из памяти и реализовывать передачу в УАРТ через DMA. Это лучшее, что можно предпринять в таких случаях. Работает не то что быстро - а "летает". )
2) Использовать для формирования строки функцию printf не рекомендовал бы. Для этого есть более шустрые itoa и прочие. Они выполнены по-проще, и работают намного быстрее. 3) ТС, вы использовали printf в качестве основной функции, передающей данные "в стандартный интерфейс". Я просто не был уверен, что CV AVR "стандартным интерфейсом по умолчанию" будет иметь именно ваш USORT1. Так ли это? Или вы где-то задали эту опцию отдельно? Обычно для того, чтобы использовать printf переопределяют функцию "putchar", которая и вызывается из стандартной printf для передачи данных. 4) Для парсинга значений я делал так: есть функция чтения значения из буфера типа: uint16_t getValue(char **buf); которая забирает значение из строки вплоть до символа разделителя или нулевого символа - окончания строки. Функция возвращает забранное значение и изменяет указатель, перемещая его к первому символу следующей цифры. Это очень удобно, когда вы хотите получить из буфера сразу несколько параметров.
2
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
|
15.06.2015, 06:18 | 15 |
прерываний нет ну с точки зрения камня, а у машины скорее всего есть
пардон,забыл сказать это используется для отладки, printf используется как отладочная печать, передает в машину данные которые приходят по USB в камень а для формирования DMX конечно никаких sprintf если работаешь чисто с числами, а если нужен "весь зоопарк", тут или скорость или удобство вполне здраво, но, по моему мнению, нужно сначала обкатать на общих случаях а потом оптимизировать а то можно нарваться где косячит в протоколе или в обработке
2
|
77 / 77 / 11
Регистрация: 02.12.2011
Сообщений: 296
|
|
15.06.2015, 07:10 [ТС] | 16 |
А можно подробнее и пример как это реалтзовать?.. никогда этой функцией не пользовался....
0
|
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
|
15.06.2015, 19:44 | 17 |
как это нет? Вот здесь по-подробнее, как вы это реализовали. Свой вариант я расписал чуть выше.
Конечно не пользовались, это самописная функция ). Она парсит посимвольно данные из представленной строки. Если символ подходит под необходимое описание, то парсинг продолжается, если не подходит, то функция пытается найти следующий "подходящий" аргумент и выходит из функции. В результате вы получаете разобранное число или вообще - данные, и ссылку на следующие данные.
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
||||||
15.06.2015, 20:27 | 18 | |||||
Сообщение было отмечено Simulkin Stas как решение
Решение
чуть по позже распишу подробно, когда с делами разгребусь
а так на вскидку переписал getc чтобы получать символ и putc чтобы отдавать все остальное взял на себя Keil
для отладки нормально, в реальном коде выбрасываю Добавлено через 2 минуты да забыл добавить УСБишка сидит вся на переываниях, так что циклы УСБ не мешают а если бы я и работу с УСАРТ вел на прерываниях, пришлось бы как то регулировать прерывания
1
|
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
|
15.06.2015, 21:07 | 19 |
ValeryS, я вас понял. Но это далеко не лучший вариант. Хотя, и совершенно не сложный.
0
|
15.06.2015, 21:07 | |
15.06.2015, 21:07 | |
Помогаю со студенческими работами здесь
19
Перевод массива из 16 битной в 8 битную систему для передачи в UART в MPLAB В массив записать разнородные данные для передачи этого пакета по сети Просмотр передачи пакета UART настройка скорости передачи. Метод передачи пакета в порт Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |