Russian Qt Forum
Ноябрь 24, 2024, 03:49
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Выбор протокола для работы через последовательный порт
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Выбор протокола для работы через последовательный порт (Прочитано 9286 раз)
8Observer8
Гость
Выбор протокола для работы через последовательный порт
«
:
Апрель 01, 2014, 08:14 »
Привет! Хочу получить опыт работы с COM-портом из Qt. Надо выбрать протокол обмена по последовательному порту.
Описание.
У меня есть микроконтроллер из серии 8052. Это тоже самое, что и Intel MCS-51:
http://en.wikipedia.org/wiki/Intel_MCS-51
, но только в моём оперативной памяти не 128 байт, а 256. К этому МК будут подсоединены датчики. И он будет передавать данные с датчиков по последовательному порту. Программа на Qt будет отображать данные с датчиков на экране в таблице QTableView.
Проблема.
Мне надо найти протокол обмена между МК и ПК. Писать свой пока желания нет. Перечислите, пожалуйста, какие протоколы изпользуются для обмена. Я полагаю, что это типичная ситуация. Расскажите о своём опыте разработки таких систем сбора информации с датчиков. Какие протоколы, при обмене данными через последовательный порт, использовали вы?
Я буду рад любой полезной информации, которая касается систем сбора информации. Главный вопрос, на данный момент - это выбор протокола обмена.
P.S. Инструментарий:
- МК: AT89S52
- Среда разработки для МК "Keil c51 uVision 4":
http://avaxhome.ws/software/ke901.html
- Программа прошивки: программатор "Хамелеон" (прошиваю МК через LPT-порт)
P.S.S Литература:
- Магда Ю.С. "Микроконтроллеры серии 8051. Практический подход"
-
www.8052.com
- встроенная справка среды Keil: Complete User's Guide Selection
«
Последнее редактирование: Апрель 01, 2014, 08:16 от 8Observer8
»
Записан
Johnik
Крякер
Online
Сообщений: 339
Re: Выбор протокола для работы через последо&
«
Ответ #1 :
Апрель 01, 2014, 08:18 »
Что значит выбор протокола?
Обычно с железкой в комплекте идет документация (или по крайней мере известно, где можно найти документацию), в которой описан протокол обмена.
Записан
8Observer8
Гость
Re: Выбор протокола для работы через последовательный порт
«
Ответ #2 :
Апрель 01, 2014, 08:20 »
Я вот сейчас нагуглил. Протокол - это что-то типа этого:
http://ru.wikipedia.org/wiki/Modbus
Но в моём случае, по-моему, он не подходит.
Протокол нужен, чтобы данные парсить. Я не представляю, как я разбирусь какие мне данные пришли без протокола.
«
Последнее редактирование: Апрель 01, 2014, 08:36 от 8Observer8
»
Записан
Johnik
Крякер
Online
Сообщений: 339
Re: Выбор протокола для работы через последовательный порт
«
Ответ #3 :
Апрель 01, 2014, 08:27 »
обычно формат обмена представляет из себя:
запрос - ответ;
и запрос и ответ последовательность байтов.
например:
1 байт длина команды
x - байтов сама команда
1 - 2 байта контрольная сумма
в ответ обычно присылается факт подтверждения приема команды и данные ответа, если они есть
Записан
8Observer8
Гость
Re: Выбор протокола для работы через последовательный порт
«
Ответ #4 :
Апрель 01, 2014, 08:35 »
По-моему, Вы пишите о самом низком уровне обмена - об RS-232. Мне же нужен логический протокол. Но не такой сложный, как Modbus. Надо что-то очень простое и популярное.
Хорошим примером того, что мне надо может служить протокол для приёма данных со спутника:
http://en.wikipedia.org/wiki/NMEA_0183
Вот такие данные программа на Qt будет считывать с COM-порта:
Цитировать
$GPGGA,092750.000,5321.6802,N,00630.3372,W,1,8,1.03,61.7,M,55.2,M,,*76
$GPGSA,A,3,10,07,05,02,29,04,08,13,,,,,1.72,1.03,1.38*0A
$GPGSV,3,1,11,10,63,137,17,07,61,098,15,05,59,290,20,08,54,157,30*70
$GPGSV,3,2,11,02,39,223,19,13,28,070,17,26,23,252,,04,14,186,14*79
$GPGSV,3,3,11,29,09,301,24,16,09,020,,36,,,*76
$GPRMC,092750.000,A,5321.6802,N,00630.3372,W,0.02,31.66,280511,,,A*43
$GPGGA,092751.000,5321.6802,N,00630.3371,W,1,8,1.03,61.7,M,55.3,M,,*75
$GPGSA,A,3,10,07,05,02,29,04,08,13,,,,,1.72,1.03,1.38*0A
$GPGSV,3,1,11,10,63,137,17,07,61,098,15,05,59,290,20,08,54,157,30*70
$GPGSV,3,2,11,02,39,223,16,13,28,070,17,26,23,252,,04,14,186,15*77
$GPGSV,3,3,11,29,09,301,24,16,09,020,,36,,,*76
$GPRMC,092751.000,A,5321.6802,N,00630.3371,W,0.06,31.66,280511,,,A*45
Записан
Johnik
Крякер
Online
Сообщений: 339
Re: Выбор протокола для работы через последовательный порт
«
Ответ #5 :
Апрель 01, 2014, 08:40 »
Цитата: 8Observer8 от Апрель 01, 2014, 08:35
По-моему, Вы пишите о самом низком уровне обмена - об RS-232. Мне же нужен логический протокол. Но не такой сложный, как Modbus. Надо что-то очень простое и популярное.
куда уж проще того, что я привел
Цитата: 8Observer8 от Апрель 01, 2014, 08:35
$GPGGA,092750.000,5321.6802,N,00630.3372,W,1,8,1.03,61.7,M,55.2,M,,*76
$GPGSA,A,3,10,07,05,02,29,04,08,13,,,,,1.72,1.03,1.38*0A
$GPGSV,3,1,11,10,63,137,17,07,61,098,15,05,59,290,20,08,54,157,30*70
$GPGSV,3,2,11,02,39,223,19,13,28,070,17,26,23,252,,04,14,186,14*79
$GPGSV,3,3,11,29,09,301,24,16,09,020,,36,,,*76
$GPRMC,092750.000,A,5321.6802,N,00630.3372,W,0.02,31.66,280511,,,A*43
$GPGGA,092751.000,5321.6802,N,00630.3371,W,1,8,1.03,61.7,M,55.3,M,,*75
$GPGSA,A,3,10,07,05,02,29,04,08,13,,,,,1.72,1.03,1.38*0A
$GPGSV,3,1,11,10,63,137,17,07,61,098,15,05,59,290,20,08,54,157,30*70
$GPGSV,3,2,11,02,39,223,16,13,28,070,17,26,23,252,,04,14,186,15*77
$GPGSV,3,3,11,29,09,301,24,16,09,020,,36,,,*76
$GPRMC,092751.000,A,5321.6802,N,00630.3371,W,0.06,31.66,280511,,,A*45
что это, если не та же последовательность байтов, которую надо уметь разбирать?
PS. вы либо неправильно объясняете, что вам нужно, либо не до конца понимаете предметную область
Записан
8Observer8
Гость
Re: Выбор протокола для работы через последовательный порт
«
Ответ #6 :
Апрель 01, 2014, 09:02 »
Цитата: Johnik от Апрель 01, 2014, 08:27
обычно формат обмена представляет из себя:
запрос - ответ;
и запрос и ответ последовательность байтов.
например:
1 байт длина команды
x - байтов сама команда
1 - 2 байта контрольная сумма
в ответ обычно присылается факт подтверждения приема команды и данные ответа, если они есть
Здесь Вы описали, то что и так происходит на уровне протокола RS-232. На логическом уровне зачем всё это надо?
Поясню. Могу ведь я поступить следующим образом. Я буду передавать от микроконтроллера название датчика и его значение:
Цитировать
ambient_temp,10;
room_temp,22;
И это будет мой протокол. Он корректен? Чем это не протокол? Зачем усложнять какими-то подтверждениями?
«
Последнее редактирование: Апрель 01, 2014, 09:04 от 8Observer8
»
Записан
Johnik
Крякер
Online
Сообщений: 339
Re: Выбор протокола для работы через последо&
«
Ответ #7 :
Апрель 01, 2014, 09:10 »
Цитата: 8Observer8 от Апрель 01, 2014, 09:02
Здесь Вы описали, то что и так происходит на уровне протокола RS-232.
вы ошибаетесь
свои команды вам предстоит отлавливать и разбирать самому
Цитата: 8Observer8 от Апрель 01, 2014, 09:02
Поясню. Могу ведь я поступить следующим образом. Я буду передавать от микроконтроллера название датчика и его значение:
Цитировать
ambient_temp,10;
room_temp,22;
И это будет мой протокол. Он корректен? Чем это не протокол? Зачем усложнять какими-то подтверждениями?
ну вот вы и описали свой протокол
Записан
8Observer8
Гость
Re: Выбор протокола для работы через последо&
«
Ответ #8 :
Апрель 01, 2014, 09:15 »
Цитата: Johnik от Апрель 01, 2014, 09:10
Цитата: 8Observer8 от Апрель 01, 2014, 09:02
Здесь Вы описали, то что и так происходит на уровне протокола RS-232.
вы ошибаетесь
свои команды вам предстоит отлавливать и разбирать самому
Я понял, о чём речь. Вы имеете ввиду, что я могу отправлять команды на борт МК. Я к этому позже вернусь. Пока надо решить задачу по приёму данных МК на ПК.
Цитата: 8Observer8 от Апрель 01, 2014, 09:02
ну вот вы и описали свой протокол
Спасибо огромное! Теперь я уверен, что правильно понял, что такое протокол
И что для приёма данных от МК ничего больше не надо
Записан
StLynx
Гость
Re: Выбор протокола для работы через последовательный порт
«
Ответ #9 :
Апрель 01, 2014, 09:33 »
Цитата: 8Observer8 от Апрель 01, 2014, 09:02
Поясню. Могу ведь я поступить следующим образом. Я буду передавать от микроконтроллера название датчика и его значение:
Цитировать
ambient_temp,10;
room_temp,22;
И это будет мой протокол. Он корректен? Чем это не протокол? Зачем усложнять какими-то подтверждениями?
Затем, что RS-232 физический протокол, на уровне напряжения и наводки/помехи могут внести искажения в данные.
Поэтому, неплохо было бы добавить контрольную сумму для сверки данных.\, а подтверждения нужны для возможности двухстороннего обмена.
Записан
Bepec
Гость
Re: Выбор протокола для работы через последовательный порт
«
Ответ #10 :
Апрель 01, 2014, 09:57 »
Протокол это соглашение между двумя сторонами по формату пересылаемых данных.
Протоколы для работы по com порту могут иметь:
1)
Начальную последовательность
. Последовательность байт, по которым вы сможете опознать начало пакета. Более сложная реализация добавляет байт стаффинг для уникальности этой последовательности.
2) Собственно сами
команды протокола
. Команды запроса/ответа и прочее.
3)
Длину пакета
. Необходима для ожидания конца передачи и проверки целостности данных. Обычно не включает в себя CRC и начальную последовательность (для того же CRC служит, но с длиной в программе работать удобнее, чем самому высчитывать).
4)
Блок данных
. Любые ваши данные, в зависимости от команды.
5)
CRC
- контрольная сумма для проверки валидности пакета.
Привожу пример.
Нач.Посл. Команда Длина Данные(№ датчика и значение - 2 пары) CRC(взял от балды.)
C0 00 01 04 00 0A 01 0C 9В 7А
Получается пакет "C0 00 01 04 00 0A 01 0C 9В 7А"
Команда 01 - ответ на запрос данных с датчиков.
И всё ясно и можно проверять валидность, парсить данные и прочая.
«
Последнее редактирование: Апрель 01, 2014, 09:59 от Bepec
»
Записан
8Observer8
Гость
Re: Выбор протокола для работы через последовательный порт
«
Ответ #11 :
Апрель 01, 2014, 10:02 »
Всем огромное спасибо! Начну реализовывать. Может быть появятся вопросы, которые я не смогу найти в гугле
Записан
OKTA
Гость
Re: Выбор протокола для работы через последовательный порт
«
Ответ #12 :
Апрель 01, 2014, 10:38 »
ModBus стоит изучить) он не такой сложный, как кажется, да и используется повсеместно
К тому же многие железяки используют что-то одно и выбирать возможности нет
Записан
alex312
Хакер
Offline
Сообщений: 606
Re: Выбор протокола для работы через последовательный порт
«
Ответ #13 :
Апрель 01, 2014, 10:39 »
http://caxapa.ru/lib/wake/
Записан
kuzulis
Джедай : наставник для всех
Offline
Сообщений: 2812
Re: Выбор протокола для работы через последовательный порт
«
Ответ #14 :
Апрель 01, 2014, 10:39 »
2 8Observer8,
возьми Modbus и не мучайся. Это самый простой протокол и более-менее надежный. Не понятно, что там сложного то?
Ты можешь, к примеру, реализовать не все его команды, а только запись/чтение в регистры типа 4x, и все, этого будет достаточно.
Но если тебе нужно только читать данные (без записи) - то это еще проще: реализуй чтение регистров типа 3x.
В этом случае можно воспользоваться не только твоей "специфической" программной для чтения данных из устройства - но и любым стандартным Modbus RTU клиентом (их куча в сети).
Для реализации, трассировки команд и пр. манипуляций с Modbus RTU можно скачать две программки Modsim32 и Modscan32 (крякнутые версии есть
).
Там все достаточно просто и банально. В сети куча сорцов для этого протокола, включая алгоритм расчета CRC и пр.
Записан
ArchLinux x86_64 / Win10 64 bit
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...