перекодировка данных по UART (из одного в другой)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
PhilX
Родился
Сообщения: 7
Зарегистрирован: Ср мар 06, 2019 22:57:33

перекодировка данных по UART (из одного в другой)

Сообщение PhilX »

есть устройство на микроконтроллере, к которому по UART подключен GSM-модуль, нужно заменить этот модуль на другой с другой системой команд без изменения кода прошивки микроконтроллера (нет исходного кода) путем подключения промежуточного микроконтроллера с двумя UART-ами. Соответственно, нужно написать для него программу перекодировки из одной системы команд в другую из одного порта в другой.

Посоветуйте, пожалуйста, как правильно решить эту задачу и, если возможно, поделитесь примером программы желательно для недорогого 8051 или stm32-M0. Заранее благодарю всех откликнувшихся за любые советы и подсказки
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: перекодировка данных по UART (из одного в другой)

Сообщение Аlex »

Если с периферией STM32 совсем тяжко, то берите CubeMX от ST. Настраиваете там 2 УАРТа, в несколько щелчков мышкой, визуально. Затем кодите ручками мост между ними, учитывая протокол обоих.
Если и с программированием совсем туго, то задача будет нелёгкой. Сколько не советуй и какими примерами Вас не закидывай.
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: перекодировка данных по UART (из одного в другой)

Сообщение oleg110592 »

[uquote="PhilX",url="/forum/viewtopic.php?p=3584396#p3584396"]поделитесь примером программы желательно для недорогого 8051 или stm32-M0[/uquote]
Для STM32F0 (Cortex m0) есть примеры Example Code snippets:
https://www.st.com/en/embedded-software ... etsf0.html
там есть:
в папке /USART/01_Transmitter/ пример передачи USART
в папке /USART/02_Receiver/ пример приема USART
в папке /USART/06_CommunicationUsingDMA/ пример приема и передачи USART с помощью DMA
весь код с комментариями.
В документации (reference manual) примеры хорошо описаны. Части кода из примеров (в основном настройки) работают в реальных проектах.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18629
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: перекодировка данных по UART (из одного в другой)

Сообщение ARV »

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

Мой уютный бложик... заходите!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Re: перекодировка данных по UART (из одного в другой)

Сообщение ПростоНуб »

В принципе, на STM8L151/152 есть целых три UART, а по цене и потреблению они тут выиграют у STM32. Если потребление не существенно, то STM8S207/208 имеют по два UART и тоже дешевле STM32.
Реклама
PhilX
Родился
Сообщения: 7
Зарегистрирован: Ср мар 06, 2019 22:57:33

Re: перекодировка данных по UART (из одного в другой)

Сообщение PhilX »

[uquote="ARV",url="/forum/viewtopic.php?p=3584518#p3584518"]а можно узнать, какой GSM-модуль на какой вы собрались заменять? меня волнует тема совместимости разных модулей...[/uquote]
модуль какой-то китайский безымянный и немаркированный хочу заменить на WISMO-228, по части совместимости у меня пока нет информации, т.к. я только посмотрел сниффером обмен контроллера с китайским модулем и сравнил с даташитом на wismo-228 -- отличается сильно, поэтому и задался целью как-то это перекодировать, но опыта в этом вопросе нет. Поэтому сначала решил разобраться с возможностью перекодировки данных по UART, а потом буду пробовать разбираться с самими командами китайского модуля.

Благодарю всех за советы, из которых я понял, что нужно изучать примеры от stm32f0, с которым я пока не знаком, а есть некоторый опыт работы с 8051, но никто по работе с UART-ом для него ничего не посоветовал (предполагал, что можно взять китайский STC с двумя УАРТ-ами).

Правильно ли я понимаю, что нужно два кольцевых буфера (один на прием, второй на передачу) и работать по прерываниям или лучше использовать freeRTOS?
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18629
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: перекодировка данных по UART (из одного в другой)

Сообщение ARV »

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

Мой уютный бложик... заходите!
PhilX
Родился
Сообщения: 7
Зарегистрирован: Ср мар 06, 2019 22:57:33

Re: перекодировка данных по UART (из одного в другой)

Сообщение PhilX »

[uquote="ARV",url="/forum/viewtopic.php?p=3584611#p3584611"]я наивно полагал, что GSM-стандарт как бы обязателен... вы уверены в существовании проблемы совместимости?[/uquote]
я с GSM-модулями ранее не имел дела и тоже предполагал, что они все одинаково стандартизованы, но первым делом перепаял вместо китайского модуля wismo-228 и устройство перестало работать. Посмотрел сниффером и увидел, что контроллер отправляет посылки в сторону модуля, но тот ему отвечает лишь в одном случае из 100. Перепаял обратно китайский модуль -- с ним работает. Несколько смутило два момента:
1) контроллер шлет некоторые команды, на которые также не отвечает китайский модуль;
2) все команды текстовые, но перед ними и после них присутствует несколько байтов;
3) модуль также отвечает текстовыми командами, но перед ними и после них также какие-то байты.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18629
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: перекодировка данных по UART (из одного в другой)

Сообщение ARV »

и как же вы планируете перекодировать на лету команды-ответы, если половина слов в вашем описании "какие-то"?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
PhilX
Родился
Сообщения: 7
Зарегистрирован: Ср мар 06, 2019 22:57:33

Re: перекодировка данных по UART (из одного в другой)

Сообщение PhilX »

[uquote="ARV",url="/forum/viewtopic.php?p=3584704#p3584704"]и как же вы планируете перекодировать на лету команды-ответы, если половина слов в вашем описании "какие-то"?[/uquote]
собираюсь через FTDI подключить к компу и попробовать с компа вычислить смысл и назначение этих неизвестных байтов, полагаю, что должен догадаться, но прежде хотел понять возможность реализации моими скромными силами перекодировщика на STC15W4K58S4 или STM32F030 и аналогичных, т.к. если получится, тогда хотелось бы на основе этого сделать себе разветвитель GPS-приемника от моего регистратора на два устройства, чтобы вторым концом подключить к магнитоле, поэтому устройство моего соседа рассматриваю в качестве стартового для первичного изучения работы с UART-ами на конкретной задаче...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18629
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: перекодировка данных по UART (из одного в другой)

Сообщение ARV »

неизвестные байты - это не 0x0D и 0x0A случайно? ;)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
PhilX
Родился
Сообщения: 7
Зарегистрирован: Ср мар 06, 2019 22:57:33

Re: перекодировка данных по UART (из одного в другой)

Сообщение PhilX »

[uquote="ARV",url="/forum/viewtopic.php?p=3584757#p3584757"]неизвестные байты - это не 0x0D и 0x0A случайно? ;)[/uquote]
нет, вернее эти в конце каждой тестовой строки тоже имеются, но перед каждой текстовой строкой что-то типа 0xAA,0x55,0xFD... и после 0x0D,0x0A тоже пару байтов (вечером заберу у соседа устройство и конкретно посмотрю на своем компе)

Добавлено after 8 hours 37 minutes 55 seconds:
[uquote="PhilX",url="/forum/viewtopic.php?p=3584764#p3584764"]посмотрю на своем компе)[/uquote]
подключил контроллер к компу через FTDI и наблюдаю следующее (все на скорости 38400):
1) из контроллера отправляется 9 байт 0x55,0xA5,0x2E,0x03,0x3F,0x0D,0x0A,0xD3,0xAA и пауза 100мсек;
2) из контроллера отправляется 9 байт 0xAA,0x5A,0xFD,0x03,0x3F,0x0D,0x0A,0x4F,0x55 и пауза 100мсек;
3..6) так повторяется еще 2раза, а потом пауза еще порядка 500мсек;
далее все снова повторяется...
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: перекодировка данных по UART (из одного в другой)

Сообщение Мурик »

ПростоНуб писал(а):STM8S207/208 имеют по два UART и тоже дешевле STM32.
Сэкономив 10 рублей в ущерб производительности и доступным ресурсам.
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Re: перекодировка данных по UART (из одного в другой)

Сообщение ПростоНуб »

[uquote="Мурик",url="/forum/viewtopic.php?p=3585706#p3585706"]
ПростоНуб писал(а):STM8S207/208 имеют по два UART и тоже дешевле STM32.
Сэкономив 10 рублей в ущерб производительности и доступным ресурсам.[/uquote]
Вы из прошлого? Даже при прямой закупке партии в STMicro разница в цене между STM8S207/208 и STM32F103 двукратна или $1. Сейчас это свыше 66 рублей. И ради чего? Чтобы греть воздух?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18629
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: перекодировка данных по UART (из одного в другой)

Сообщение ARV »

ну понятно... опять собрались экономисты, теперь тема либо уйдет в мусорку (если я подключусь), либо превратится в разговоры о том, как прекрасны и дешевы STM32. а на топикстартера всем будет наплевать, хотя проблема у него на 100% не в типе микроконтроллера... и модераторы спят или пьют.а если поставить законные минусы за подобные рассуждения - так вони не оберешься. все ж честные и принципиальные...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: перекодировка данных по UART (из одного в другой)

Сообщение Мурик »

ПростоНуб писал(а):Даже при прямой закупке партии в STMicro разница в цене между STM8S207/208 и STM32F103 двукратна или $1.
Цена STM32F103 около 1$ Хотите сказать что покупаете STM8 бесплатно? :shock: :)))
Чтобы переходировать данные, нужно ОЗУ которого в STM32 больше чем в STM8. Вот и думайте стоит ли экономия 10 рублей дальнейших сложностей при разработке программы.
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Re: перекодировка данных по UART (из одного в другой)

Сообщение ПростоНуб »

[uquote="Мурик",url="/forum/viewtopic.php?p=3586064#p3586064"]
ПростоНуб писал(а):Даже при прямой закупке партии в STMicro разница в цене между STM8S207/208 и STM32F103 двукратна или $1.
Цена STM32F103 около 1$ Хотите сказать что покупаете STM8 бесплатно? :shock: :)))[/uquote]

STM8S207C8
https://www.st.com/content/st_com/en/pr ... 207c8.html
СпойлерИзображение
STM32F103C8
https://www.st.com/content/st_com/en/pr ... 103c8.html
СпойлерИзображение
Ваш ход. Или признаете себя совравшим?

P.S. 8Кбайт RAM в разы превышают максимально допустимую длину сообщения GSM модуля, которая никогда не бывает длинее 2Кбайт - у него просто памяти у самого больше нет! На практике же, 0.5Кбайт буфера хватит за глаза для любого применения.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: перекодировка данных по UART (из одного в другой)

Сообщение Мурик »

ПростоНуб писал(а):Ваш ход.
1.09$ шт. с бесплатной доставкой https://ru.aliexpress.com/item/5PCS-STM ... 21969.html

Вы покупали у ST партию МК состоящую из 10000 шт.? Если нет, то к чему эти таблицы?
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Re: перекодировка данных по UART (из одного в другой)

Сообщение ПростоНуб »

[uquote="Мурик",url="/forum/viewtopic.php?p=3586103#p3586103"]
ПростоНуб писал(а):Ваш ход.
1.09$ шт. с бесплатной доставкой https://ru.aliexpress.com/item/5PCS-STM ... 21969.html[/uquote]
По ссылке перемаркированный CS32F103C8T6.
СпойлерИзображение
Вы же писали про STM32, а вовсе не о его китайском клоне, мало пригодном для практического применения ни с точки зрения энергопотребления, ни с точки зрения эксплуатационных температур.
Так и пишите в следующий раз, что речь о CS32, Но я бы, скорее, GD32 стал использовать, чем его )

Добавлено after 1 minute 30 seconds:
[uquote="Мурик",url="/forum/viewtopic.php?p=3586103#p3586103"]Вы покупали у ST партию МК состоящую из 10000 шт.? Если нет, то к чему эти таблицы?[/uquote]
Лично я - нет. Мой работодатель и ряд моих клиентов - да.
PhilX
Родился
Сообщения: 7
Зарегистрирован: Ср мар 06, 2019 22:57:33

Re: перекодировка данных по UART (из одного в другой)

Сообщение PhilX »

[uquote="ARV",url="/forum/viewtopic.php?p=3585865#p3585865"]проблема у него на 100% не в типе микроконтроллера...[/uquote]
правильно подмечено -- у меня нет задачи массового производства, поэтому с учетом имеющихся у меня в шкафу нескольких разных микроконтроллеров 8051 от STC и парочки stm32f030 и stm32f042, вопрос цены совершенно не актуален для меня. Главное понять, как правильно решить задачу и потом ее решить успешно...

Сутки экспериментов позволили выяснить следующее:
1) похоже, что все-таки система команд разных GSM-модулей как-то стандартизована и обмен команд полностью текстовый;
2) у этого китайского устройства заложен алгоритм работы с двумя модулями через один UART-порт и сначала идет опрос обоих, а после получения ответа далее идет обмен путем инкапсуляции обычных текстовых команд GSM-модулей внутрь бинарных пакетов

Работает в итоге так:
1) сначала контроллер посылает 9 байтов запроса первому модулю 0x55,0xA5,0x2E,0x03,0x3F,0x0D,0x0A,0xD3,0xAA и ждет от него ответ в течение порядка 100мсек, но ответа не приходит, т.к. такого модуля нет;

2) далее контроллер посылает 9 байтов запроса второму модулю 0xAA,0x5A,0xFD,0x03,0x3F,0x0D,0x0A,0x4F,0x55, где
0xAA -- начальный байт, вероятно для синхронизации или чего-то такого, т.к. в контрольную сумму его не включают;
0x5A -- тоже начальный байт, но его уже включают в контрольную сумму этой посылки;
0xFD -- тоже начальный байт, который также включается в контрольную сумму;
0x03 -- длина текстовой посылки, вероятно, предназначающийся модулю;
0x3F -- как я понял, команда запроса модуля ("?");
0x0D,0x0A -- завершение текстовой строки;
0x4F -- контрольная сумма байтов 0x5A,0xFD,0x03,0x3F,0x0D,0x0A, но инверсная (xor 0xFF);
0x55 -- завершающий байт, вероятно для синхронизации или чего-то такого, т.к. в контрольную сумму его не включают

3) модуль сразу отвечает ему посылкой из 12 байтов 0xAA,0x82,0xFD,0x06,0x4F,0x4B,0x38,0x32,0x0D,0x0A,0x5F,0x55, где
0xAA -- начальный байт, вероятно для синхронизации или чего-то такого, т.к. в контрольную сумму его не включают;
0x82 -- тоже начальный байт, но его уже включают в контрольную сумму этой посылки;
0xFD -- тоже начальный байт, который также включается в контрольную сумму;
0x06 -- длина текстовой посылки;
0x4F,0x4B,0x38,0x32 -- как я понял, команда ответа модуля ("OK82");
0x0D,0x0A -- завершение текстовой строки;
0x5F -- контрольная сумма байтов 0x82,0xFD,0x06,0x4F,0x4B,0x38,0x32,0x0D,0x0A, но инверсная (xor 0xFF);
0x55 -- завершающий байт, вероятно для синхронизации или чего-то такого, т.к. в контрольную сумму его не включают

4) далее контроллер отправляет команду инициализации из 11 байтов 0xAA,0x5A,0xFD,0x05,0x41,0x54,0x5A,0x0D,0x0A,0x9D,0x55, где
0xAA -- начальный байт, вероятно для синхронизации или чего-то такого, т.к. в контрольную сумму его не включают;
0x5A -- тоже начальный байт, но его уже включают в контрольную сумму этой посылки;
0xFD -- тоже начальный байт, который также включается в контрольную сумму;
0x05 -- длина текстовой посылки, вероятно, предназначающийся модулю;
0x41,0x54,0x5A -- как я понял, команда запроса модуля ("ATZ");
0x0D,0x0A -- завершение текстовой строки;
0x9D -- контрольная сумма байтов 0x5A,0xFD,0x05,0x41,0x54,0x5A,0x0D,0x0A, но инверсная (xor 0xFF);
0x55 -- завершающий байт, вероятно для синхронизации или чего-то такого, т.к. в контрольную сумму его не включают

5) модуль сразу отвечает ему посылкой из 10 байтов 0xAA,0x82,0xFD,0x04,0x4F,0x4B,0x0D,0x0A,0xCB,0x55, где
0xAA -- начальный байт, вероятно для синхронизации или чего-то такого, т.к. в контрольную сумму его не включают;
0x82 -- тоже начальный байт, но его уже включают в контрольную сумму этой посылки;
0xFD -- тоже начальный байт, который также включается в контрольную сумму;
0x04 -- длина текстовой посылки;
0x4F,0x4B -- как я понял, команда ответа модуля ("OK");
0x0D,0x0A -- завершение текстовой строки;
0xCB -- контрольная сумма байтов 0x82,0xFD,0x06,0x4F,0x4B,0x0D,0x0A, но инверсная (xor 0xFF);
0x55 -- завершающий байт, вероятно для синхронизации или чего-то такого, т.к. в контрольную сумму его не включают

и т.д. и внутри этих посылок находятся текстовые команды, соответственно, мне нужно принимать команды от контроллера и вычленять из них только текстовую команду, которую отправлять wismo228 с учетом его специфики, а обратно принимать тестовые команды от wismo228 и перед отправкой в сторону контроллера "упаковывать" их согласно описанного выше.
Ответить

Вернуться в «Разные вопросы по МК»