Обмен данными с устройством

Все о микроконтроллерах: AVR, PIC, STM8, STM32, Arduino, Altera, Xilinx, все что угодно. Этот раздел для всего что клацает байтиками.
Qic
Сообщения: 985

Сообщение Qic » 17 апр 2013, 21:22

Доброго времени суток!
Вероятно рано или поздно перед каждым встает вопрос по обмену данными с изготовленным устройством.
В данный момент передомной встала проблема отладки, настройки и управления системой с ПИД регулятором на ATmega8.
Если в программировании МК я немного разбираюсь, то с софтом для "большого брата" я не силён.
В данный момент (и ранее) я использую следующие идеи в обмене данными:
- Со стороны МК:
1) Прием. Я делал сервоконтроллер. Данные принимались пакетом, пакет начинается с определённого байта и заканчивается еще одним. Длина пакета постоянна. Если мк получает в прерывании начальный байт, то в цикле разбирает всё остальное в временные переменные и если совпадает последний байт то все данные "верны". Пока это работало.
2) Передачей я пока не занимался так как не могу написать программу для ПК. Сперва я думал также отправлять, но терзают мысли о форсмажоре. Согласно примеру http://podrugomu.com/node/981 решено байты разделять "," и в конце делать новую строку "\n".
- Со стороны ПК:
У программы задач не много, принять пакет и показать значения, некоторые значения поменять и отправить обратно. Попутно нарисовать график.
С языком программирования возник вопрос. Ранее я делал калькулятор на matlab, и поэтому для создания интерфейса мне приглянулся qt designer.
С основным телом программы пока сложности. (одна бабка сказала) На питоне отладка проще, и чем-то он привлекает. Может быть его?

Собственно интересует любое мнение в данном вопросе.

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 17 апр 2013, 21:30

Кстати, как раз для такой задачи как у тебя есть labview, может его? И программить ничего не нужно будет - просто покидаешься квадратиками.

Qic
Сообщения: 985

Сообщение Qic » 17 апр 2013, 21:39

И лабвью и матлаб есть, и даже интерфейсная плата от нешнл инструментс. Только лабвью имеет смысл дабы самостоятельно чем-то рулить. Но в данной ситуации он чрезмерно жирен. В последствии я планирую упихать ПО компьютера в железку (например http://www.tp-linkru.com/products/detai ... =TL-MR3020 ) c ethernet и usart - дабы рулить железом на промышленный манер. Не знаю на сколько это оправдано, но лично я не хочу несоразмерной нагрузки по ресурсам и железу.

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 17 апр 2013, 21:45

Хм, если ты хочешь это на линупсе запускать, тогда действительно имеет смысл сделать это не питоне, яве или чем-то другом кросплатформенном.

Victor
Сообщения: 24
Откуда: Киев

Сообщение Victor » 17 апр 2013, 23:33

По поводу обмена вообще - я бы посоветовал один раз реализовать некий простой и удобный протокол и использовать его во всех устройствах.
В итоге выйдет быстрее, чем каждый раз колхозить что-то свое.

То, что описано у Вас в пункте 2 - тоже некий протокол.
Но, навскидку:
1) Если среди передаваемых байтов будет такой, который соответсвует \n (0x0D) или запятой (0x2C) - вы либо не до конца дочитаете, либо неправильно интерпретируете полученные данные.
2) Если устройства (приемник и передатчик) будут включены не одновременно - как приемник будет определять что он принимает посылку сначала, а не с середины?

Вообще, у меня в данный момент стоит подобная задача. Колхозный вариант реализовал. Теперь думаю о протоколе.
Из того что понравилось - http://digit-el.com/files/open/wake/wake.html

Там, кстати, и библиотеки для ПК есть (правда не уверен заведутся ли они на последних виндах), и примеры реализации для контроллеров (в том числе и АВР, хотя для меня сейчас актуальнее STM). И протокол простейший (не сильно сложнее варианта с запятыми и \n, но гораздо богаче и экономнее) - портировать на другие контроллеры должно быть элементарно, да и на ПК написать что-то свое не должно быть проблемой.

На чем писать "ПК-шную" часть - тут полностью соглашусь с предыдущим комментарием.
Хотя я писал бы на C#. Но только потому, что это мой основной инструмент и на нем лично я это сделаю на порядок быстрее, чем на чем-то другом. Например на свой колхозный вариант я потратил минут 30, при том что до этого никогда не работал с СОМ-портами из .NET

Qic
Сообщения: 985

Сообщение Qic » 18 апр 2013, 00:05

У меня сейчас чертовски сложная ситуация.
Мне предстоит выбор между тем что есть в наличии (умение программировать авр, и элементарный протокол) без особой гарантии на будущий результат (ограниченная 8 битная математика итд), и более логичными решениями с более гарантированным результатом но в которых я не шарю абсолютно (stm32, хотябы этотже протокол wake и тд.).
Разум подсказывает выбрать второе.
Но лень говорит брать первое. Потерять недели на освоение и переделку или сидеть на своем без гарантий, учитывая что остался месяц с кепкой.

На счет совпадения байтов - меня это и беспокоит в первую очередь.
На счет включения устройства - МК в роли ведомого, при подаче питания инициализируется и ждет разрешения отрапортовав о готовности. Получив добро начинает спамить данными.
Речи о RS485 и сети из кучи устройств не идет. Пока не идет.

За протокол спасибо. Изучим. Но как я понял для работы с темже питоном его надо будет както подхватывать из длл или переписывать. Еще одна задача. А время на отладку отладочного оборудования хотелось бы свести к минимуму. Но не судьба.

Victor
Сообщения: 24
Откуда: Киев

Сообщение Victor » 18 апр 2013, 00:27

Смотрите, протокол - это просто договоренность о правилах общения. Вот ваш протокол можно сформулировать как передаем байты, разделенные запятыми, а в конце ставим /n
Wake коротко можно сформулироать так - перед данными передаем код начала, потом тип посылки (номер команды) и количество данных, которые будем передавать. Если в данных встетится байт, который соответсвует коду начала - заменяем его на 2 заспецифицированных байта (эскейпим). Собсвенно это практически все.
Если Вы будете решать проблемму запятых /n - получите протокол, котрый вряд ли будет проще этого вейка. Если не будете - получите кучу проблем...
Кроме того, для вейка уже есть готовая реализация для Авр, который у вас и используется. А также есть готовая прога бля пк, которой с головой должно хватить для отладки устройства.
Что касается ПК-шной части - Вам все-равно нужно будет реализовывать какой-то протокол - либо Ваш, либо какой-то другой.
С моей точки зрения, реализация Вашего протокола для пк по сложности практически сравнима с реализацией вейка. Это если оба делать с нуля.
С другой стороны, для вейка уже есть готовые библиотеки в исходниках для пк и под винду и под юникс - это должно еще и ускорить разработку.
Вобщем, не так страшен черт как его малюют.

Victor
Сообщения: 24
Откуда: Киев

Сообщение Victor » 18 апр 2013, 00:31

Кстати, а на пк у вас к какому языку душа лежит - к чему склоняетесь?

upd извиняюсь, невнимательно прочитал первый пост.
По поводу питона особо не подскажу - к сожалению сталкивался с ним только раз да и то по мелочи - задачу решили и забыли. Тем не менее, впечатления что там отладка чем то лучше/продвинутее других языков у меня не возникло.
Вообще удобство отладки на пк больше зависит от среды разработки, а не от языка.
Например сама среда у IAR очень убогая. Гораздо хуже той же AVR студии. Хотя и там и там можно писать на С/С++
Последний раз редактировалось Victor 18 апр 2013, 00:50, всего редактировалось 1 раз.

Victor
Сообщения: 24
Откуда: Киев

Сообщение Victor » 18 апр 2013, 00:37

Да, по поводу rs485 - wake не накладывает ограниечений на транспортный уровень - что хотите - то и используйте - хоть rs232, хоть rs485, хоть usb, хоть что угодно. Сам протокол описывает как интерпретировать данные, которые Вы уже получили. А каким оьразом вы их получили - не важно.

Qic
Сообщения: 985

Сообщение Qic » 18 апр 2013, 01:58

Программировал в школе на паскале. Для мк использую Си (если можно это вообще так назвать).
Ассемблер для МК и ПК ознакомлен. Также небольшой опыт в томже матлабе. Для плк писал. Кароче всё си/паскале подобное.
Не знаю на сколько правда, но говорят что питон прост в отладке.
В принципе имеет смысл перейти и на стм32 (дискавери есть) и на питон. Отладка и там и там. Должно получиться хорошо.

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 18 апр 2013, 07:37

Лично мне, наоборот отладка питоновская не нравится. Намного лучше c#, но если тебе нужна крос-платформенность, то однозначно стоит смотреть на питон. Для c# есть mono под линукс, но это далеко не то-же самое, что и .net под виндовс.

Аватара пользователя
N1X
Сообщения: 321
Откуда: Беларусь, Гомель

Сообщение N1X » 18 апр 2013, 21:25

По протоколу, в подобных задачах обычно делается просто:
Пакетная передача, формат пакета примерно:
1. От кого - по вкусу
2. Кому - по вкусу
3. Идентификатор пакета - в принципе тож по вкусу
4. Длина данных (число байт данных)
5. Собственно данные, n байт из п.4
6. Контрольная сумма: Тупой xor поля данных, иди длины+поля данных, тут уже варьировать можно.

Собственно принимающий считает контрольную сумму и принимает решение о валидности... Если не сошлось - в ответ можно пнуть пакет об ошибке например...
Для верности скорость порта - по минимуму, насколько возможно чтобы хватило на канал...

Proletariat
Сообщения: 88
Откуда: Москва-Киров

Сообщение Proletariat » 18 апр 2013, 22:02

Так, тогда и от себя добавлю.
Использовал разные протоколы, как помехозащищенные, так и без всякой защиты.

То, что вы здесь описываете мы называем byte staffing. Данный протокол мне встречался часто (Есть реализация его для AVR в ИАРЕ, для PC в Borland C-builder и Delphi).

Сейчас я перешел чуть дальше и использую более продвинутый протокол MODBUS(http://en.wikipedia.org/wiki/Modbus). Протокол этот позволяет подключать большое количество устройств (до 127) к одному мастеру. Устройства обладают общим пространством регистров. Словами как то даже и трудно описать все его достоинства.
Скачать исходники можно тут: http://freemodbus.berlios.de/ (есть порты под АВР).

Благодаря моему приятелю Пете есть порт под ST32. Если кого интересует могу выложить.
Под PC есть большое количество программ, с помощью которых можно управлять устройством по MODBUS (да даже и терминал обычный сгодится).
+ мною написана dll, с помощью которой можно делать некоторые операции с устройством.
Да, и последнее, MODBUS поддерживается LabView.

Qic
Сообщения: 985

Сообщение Qic » 18 апр 2013, 23:00

Интересует под stm32.
Если я правильно понимаю что модбас это протокол пром стандарта, то определённо интересует.
Надеюсь дойду до него в долгосрочной перспективе.

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 19 апр 2013, 08:51

Если я правильно понимаю что модбас это протокол пром стандарта

Да, пром. стандарт.

Я тоже использовал modbus. Лично мне он не понравился.
Во-первых, жесткая завязка на тайминги практически не реализуема на ПК из-за буферизации. Те библиотеки, что есть, работают. Но никто не обещает, что завтра они продолжат работать.
Во-вторых, какая-то очень странная модель адресации регисторов (эм, с волшебного адреса 40000).
В-третьих, почему-то эти регистры двубайтные. Если нужно больше, приходится выдумывать. А если понадобится больше 65кБайт регистрового пространства, то совсем беда.

Почитал про wake, мне он больше нравится.

Ferdik
Сообщения: 1

Сообщение Ferdik » 14 мар 2015, 15:20

можно ли сделать отладку LPC17xx на STM32

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 15 мар 2015, 20:57

Эм, сложный и не понятный вопрос :)

Qic
Сообщения: 985

Сообщение Qic » 15 мар 2015, 21:25

Наверное ответ "Можно, я разрешаю" :)
Кстати по поводу связи с устройством. В процессе увеличения опыта я освоил и пришел к выводу что MODBUS очень приятное решение, очень очень. Как и сам RS-485.
По факту я бы назвал его собратом JTAG (тоже интересное решение). По сути речь идет о программном или физическом способе работы с регистрами процессора (или переменными).
Кушает не много, всем рекомендую. Особенно интересно имея готовый код модбаса его можно элементарно прикрутить к TCP, который по сути будет заменой 485го на какомнибудь распространённом Ethernet чипе или GSM модеме. Всё что требуется открыть порт и слушать его, а дальше как обычно. Очень универсальное решение.

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 15 мар 2015, 21:43

Я когда с модбасом работал, наоборот не очень его полюбил из-за сильной ограниченности. Вот к чему эти переменные по 2 байта? Чтобы что-то приличное уместить, приходится придумывать как их объеденять. Кроме того, из-за терминаторов RS485 жрет много энергии - от батарейки уже работать не будет просто так. Да и сами эти терминаторы должны быть на конечных устройствах, а на промежуточных их быть не должно, а значит, должен быть либо переключатель, либо обучать пользователей резисторы вкурчивать, либо устройство сам должно определять где оно и включать эти терминаторы.

Вообщем, мрака порядком, поэтому у меня средненькие впечателния от этого всего :)

Qic
Сообщения: 985

Сообщение Qic » 15 мар 2015, 22:32

Ну от модбаса по сути важна идеология. Перекошачить его можно как угодно. Если код хорошо написан то просто дефайны поменять и уже не 2 байта а 4 или сколько надо.
Не смотрел сколько 485й ест. Посмотрю при случае. А вообще каждый интсрумент для своего дела - я в частности про пром автоматику или многомодульные системы подноготная которых далека от юзера.

В прочем - лишь сам смысл модбаса имеет суть. Это заведомо известные регистры к которым всегда есть доступ. Это контрольная сумма (кудаж без неё). Это подтверждение приема пакета.
Посути это основные принципы связи во многих решениях порой долёких друг от друга. Это полезно изучить в качестве основ.

P.S. Я не призываю сувать его всюду и сразу. Есть места более простые, или более сложные, где такие рамки абсолютно не уперлись, но его реинкарнация проглядывается много где.

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 15 мар 2015, 22:36

Ну, как-бы, если использовать не два байта, то это, формально, уже не модбас :ugeek:

Вернуться в «Микроконтроллеры и ПЛИС»



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 12 гостей