Russian Qt Forum

Qt => Общие вопросы => Тема начата: 8Observer8 от Апрель 01, 2014, 08:14



Название: Выбор протокола для работы через последовательный порт
Отправлено: 8Observer8 от Апрель 01, 2014, 08:14
Привет! Хочу получить опыт работы с COM-портом из Qt. Надо выбрать протокол обмена по последовательному порту.

Описание.
У меня есть микроконтроллер из серии 8052. Это тоже самое, что и Intel MCS-51: http://en.wikipedia.org/wiki/Intel_MCS-51, но только в моём оперативной памяти не 128 байт, а 256. К этому МК будут подсоединены датчики. И он будет передавать данные с датчиков по последовательному порту. Программа на Qt будет отображать данные с датчиков на экране в таблице QTableView.

(http://i6.pixs.ru/storage/8/1/9/boardjpg_5026129_11495819.jpg)

Проблема.
Мне надо найти протокол обмена между МК и ПК. Писать свой пока желания нет. Перечислите, пожалуйста, какие протоколы изпользуются для обмена. Я полагаю, что это типичная ситуация. Расскажите о своём опыте разработки таких систем сбора информации с датчиков. Какие протоколы, при обмене данными через последовательный порт, использовали вы?

Я буду рад любой полезной информации, которая касается систем сбора информации. Главный вопрос, на данный момент - это выбор протокола обмена.

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


Название: Re: Выбор протокола для работы через последо&
Отправлено: Johnik от Апрель 01, 2014, 08:18
Что значит выбор протокола?

Обычно с железкой в комплекте идет документация (или по крайней мере известно, где можно найти документацию), в которой описан протокол обмена.


Название: Re: Выбор протокола для работы через последовательный порт
Отправлено: 8Observer8 от Апрель 01, 2014, 08:20
Я вот сейчас нагуглил. Протокол - это что-то типа этого: http://ru.wikipedia.org/wiki/Modbus

Но в моём случае, по-моему, он не подходит.

Протокол нужен, чтобы данные парсить. Я не представляю, как я разбирусь какие мне данные пришли без протокола.


Название: Re: Выбор протокола для работы через последовательный порт
Отправлено: Johnik от Апрель 01, 2014, 08:27
обычно формат обмена представляет из себя:
запрос - ответ;
и запрос и ответ последовательность байтов.
например:
1 байт длина команды
x - байтов сама команда
1 - 2 байта контрольная сумма
в ответ обычно присылается факт подтверждения приема команды и данные ответа, если они есть


Название: Re: Выбор протокола для работы через последовательный порт
Отправлено: 8Observer8 от Апрель 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


Название: Re: Выбор протокола для работы через последовательный порт
Отправлено: Johnik от Апрель 01, 2014, 08:40
По-моему, Вы пишите о самом низком уровне обмена - об RS-232. Мне же нужен логический протокол. Но не такой сложный, как Modbus. Надо что-то очень простое и популярное.
куда уж проще того, что я привел

$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. вы либо неправильно объясняете, что вам нужно, либо не до конца понимаете предметную область


Название: Re: Выбор протокола для работы через последовательный порт
Отправлено: 8Observer8 от Апрель 01, 2014, 09:02
обычно формат обмена представляет из себя:
запрос - ответ;
и запрос и ответ последовательность байтов.
например:
1 байт длина команды
x - байтов сама команда
1 - 2 байта контрольная сумма
в ответ обычно присылается факт подтверждения приема команды и данные ответа, если они есть
Здесь Вы описали, то что и так происходит на уровне протокола RS-232. На логическом уровне зачем всё это надо?

Поясню. Могу ведь я поступить следующим образом. Я буду передавать от микроконтроллера название датчика и его значение:
Цитировать
ambient_temp,10;
room_temp,22;

И это будет мой протокол. Он корректен? Чем это не протокол? Зачем усложнять какими-то подтверждениями?


Название: Re: Выбор протокола для работы через последо&
Отправлено: Johnik от Апрель 01, 2014, 09:10
Здесь Вы описали, то что и так происходит на уровне протокола RS-232.
вы ошибаетесь
свои команды вам предстоит отлавливать и разбирать самому

Поясню. Могу ведь я поступить следующим образом. Я буду передавать от микроконтроллера название датчика и его значение:
Цитировать
ambient_temp,10;
room_temp,22;
И это будет мой протокол. Он корректен? Чем это не протокол? Зачем усложнять какими-то подтверждениями?
ну вот вы и описали свой протокол


Название: Re: Выбор протокола для работы через последо&
Отправлено: 8Observer8 от Апрель 01, 2014, 09:15
Здесь Вы описали, то что и так происходит на уровне протокола RS-232.
вы ошибаетесь
свои команды вам предстоит отлавливать и разбирать самому
Я понял, о чём речь. Вы имеете ввиду, что я могу отправлять команды на борт МК. Я к этому позже вернусь. Пока надо решить задачу по приёму данных МК на ПК.

ну вот вы и описали свой протокол
Спасибо огромное! Теперь я уверен, что правильно понял, что такое протокол :) И что для приёма данных от МК ничего больше не надо :)


Название: Re: Выбор протокола для работы через последовательный порт
Отправлено: StLynx от Апрель 01, 2014, 09:33
Поясню. Могу ведь я поступить следующим образом. Я буду передавать от микроконтроллера название датчика и его значение:
Цитировать
ambient_temp,10;
room_temp,22;

И это будет мой протокол. Он корректен? Чем это не протокол? Зачем усложнять какими-то подтверждениями?

Затем, что RS-232 физический протокол, на уровне напряжения и наводки/помехи могут внести искажения в данные.
Поэтому, неплохо было бы добавить контрольную сумму для сверки данных.\, а подтверждения нужны для возможности двухстороннего обмена.


Название: Re: Выбор протокола для работы через последовательный порт
Отправлено: Bepec от Апрель 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 - ответ на запрос данных с датчиков.
И всё ясно и можно проверять валидность, парсить данные и прочая.


Название: Re: Выбор протокола для работы через последовательный порт
Отправлено: 8Observer8 от Апрель 01, 2014, 10:02
Всем огромное спасибо! Начну реализовывать. Может быть появятся вопросы, которые я не смогу найти в гугле :)


Название: Re: Выбор протокола для работы через последовательный порт
Отправлено: OKTA от Апрель 01, 2014, 10:38
ModBus стоит изучить) он не такой сложный, как кажется, да и используется повсеместно  ;) К тому же многие железяки используют что-то одно и выбирать возможности нет  :)


Название: Re: Выбор протокола для работы через последовательный порт
Отправлено: alex312 от Апрель 01, 2014, 10:39
http://caxapa.ru/lib/wake/


Название: Re: Выбор протокола для работы через последовательный порт
Отправлено: kuzulis от Апрель 01, 2014, 10:39
2 8Observer8,

возьми Modbus и не мучайся. Это самый простой протокол и более-менее надежный. Не понятно, что там сложного то?

Ты можешь, к примеру, реализовать не все его команды, а только запись/чтение в регистры типа 4x, и все, этого будет достаточно.
Но если тебе нужно только читать данные (без записи) - то это еще проще: реализуй чтение регистров типа 3x. :)

В этом случае можно воспользоваться не только твоей "специфической" программной для чтения данных из устройства - но и любым стандартным Modbus RTU клиентом (их куча в сети).

Для реализации, трассировки команд и пр. манипуляций с Modbus RTU можно скачать две программки Modsim32 и Modscan32 (крякнутые версии есть :) ).
Там все достаточно просто и банально. В сети куча сорцов для этого протокола, включая алгоритм расчета CRC и пр.


Название: Re: Выбор протокола для работы через последовательный порт
Отправлено: 8Observer8 от Апрель 01, 2014, 10:46
Спасибо всем огромное! :)

Я в таком порядке сделаю:

1) Реализую передачу от МК по протоколу (название_датчика, значение;):
Цитировать
ambient_temp,10;
room_temp,22;

2) Реализую протокол, как написал Bepec

3) Реализую по ссылке alex312: http://caxapa.ru/lib/wake/

4) Реализую ModBus