Название: Выбор протокола для работы через последовательный порт Отправлено: 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 обычно формат обмена представляет из себя: Здесь Вы описали, то что и так происходит на уровне протокола RS-232. На логическом уровне зачем всё это надо?запрос - ответ; и запрос и ответ последовательность байтов. например: 1 байт длина команды x - байтов сама команда 1 - 2 байта контрольная сумма в ответ обычно присылается факт подтверждения приема команды и данные ответа, если они есть Поясню. Могу ведь я поступить следующим образом. Я буду передавать от микроконтроллера название датчика и его значение: Цитировать 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 |