Russian Qt Forum
Ноябрь 24, 2024, 03:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [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 Online

Сообщений: 339


Просмотр профиля
« Ответ #1 : Апрель 01, 2014, 08:18 »

Что значит выбор протокола?

Обычно с железкой в комплекте идет документация (или по крайней мере известно, где можно найти документацию), в которой описан протокол обмена.
Записан
8Observer8
Гость
« Ответ #2 : Апрель 01, 2014, 08:20 »

Я вот сейчас нагуглил. Протокол - это что-то типа этого: http://ru.wikipedia.org/wiki/Modbus

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

Протокол нужен, чтобы данные парсить. Я не представляю, как я разбирусь какие мне данные пришли без протокола.
« Последнее редактирование: Апрель 01, 2014, 08:36 от 8Observer8 » Записан
Johnik
Крякер
****
Online Online

Сообщений: 339


Просмотр профиля
« Ответ #3 : Апрель 01, 2014, 08:27 »

обычно формат обмена представляет из себя:
запрос - ответ;
и запрос и ответ последовательность байтов.
например:
1 байт длина команды
x - байтов сама команда
1 - 2 байта контрольная сумма
в ответ обычно присылается факт подтверждения приема команды и данные ответа, если они есть
Записан
8Observer8
Гость
« Ответ #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 Online

Сообщений: 339


Просмотр профиля
« Ответ #5 : Апрель 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. вы либо неправильно объясняете, что вам нужно, либо не до конца понимаете предметную область
Записан
8Observer8
Гость
« Ответ #6 : Апрель 01, 2014, 09:02 »

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

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

И это будет мой протокол. Он корректен? Чем это не протокол? Зачем усложнять какими-то подтверждениями?
« Последнее редактирование: Апрель 01, 2014, 09:04 от 8Observer8 » Записан
Johnik
Крякер
****
Online Online

Сообщений: 339


Просмотр профиля
« Ответ #7 : Апрель 01, 2014, 09:10 »

Здесь Вы описали, то что и так происходит на уровне протокола RS-232.
вы ошибаетесь
свои команды вам предстоит отлавливать и разбирать самому

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

Здесь Вы описали, то что и так происходит на уровне протокола RS-232.
вы ошибаетесь
свои команды вам предстоит отлавливать и разбирать самому
Я понял, о чём речь. Вы имеете ввиду, что я могу отправлять команды на борт МК. Я к этому позже вернусь. Пока надо решить задачу по приёму данных МК на ПК.

ну вот вы и описали свой протокол
Спасибо огромное! Теперь я уверен, что правильно понял, что такое протокол Улыбающийся И что для приёма данных от МК ничего больше не надо Улыбающийся
Записан
StLynx
Гость
« Ответ #9 : Апрель 01, 2014, 09:33 »

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

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

Затем, что RS-232 физический протокол, на уровне напряжения и наводки/помехи могут внести искажения в данные.
Поэтому, неплохо было бы добавить контрольную сумму для сверки данных.\, а подтверждения нужны для возможности двухстороннего обмена.
Записан
Bepec
Гость
« Ответ #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
Гость
« Ответ #11 : Апрель 01, 2014, 10:02 »

Всем огромное спасибо! Начну реализовывать. Может быть появятся вопросы, которые я не смогу найти в гугле Улыбающийся
Записан
OKTA
Гость
« Ответ #12 : Апрель 01, 2014, 10:38 »

ModBus стоит изучить) он не такой сложный, как кажется, да и используется повсеместно  Подмигивающий К тому же многие железяки используют что-то одно и выбирать возможности нет  Улыбающийся
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #13 : Апрель 01, 2014, 10:39 »

http://caxapa.ru/lib/wake/
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #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   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.114 секунд. Запросов: 22.