Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

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

Ср мар 06, 2019 23:19:08

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

Посоветуйте, пожалуйста, как правильно решить эту задачу и, если возможно, поделитесь примером программы желательно для недорогого 8051 или stm32-M0. Заранее благодарю всех откликнувшихся за любые советы и подсказки

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

Чт мар 07, 2019 00:53:16

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

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

Чт мар 07, 2019 08:05:57

поделитесь примером программы желательно для недорогого 8051 или stm32-M0

Для 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) примеры хорошо описаны. Части кода из примеров (в основном настройки) работают в реальных проектах.

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

Чт мар 07, 2019 08:36:01

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

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

Чт мар 07, 2019 09:28:20

В принципе, на STM8L151/152 есть целых три UART, а по цене и потреблению они тут выиграют у STM32. Если потребление не существенно, то STM8S207/208 имеют по два UART и тоже дешевле STM32.

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

Чт мар 07, 2019 10:03:32

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

модуль какой-то китайский безымянный и немаркированный хочу заменить на WISMO-228, по части совместимости у меня пока нет информации, т.к. я только посмотрел сниффером обмен контроллера с китайским модулем и сравнил с даташитом на wismo-228 -- отличается сильно, поэтому и задался целью как-то это перекодировать, но опыта в этом вопросе нет. Поэтому сначала решил разобраться с возможностью перекодировки данных по UART, а потом буду пробовать разбираться с самими командами китайского модуля.

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

Правильно ли я понимаю, что нужно два кольцевых буфера (один на прием, второй на передачу) и работать по прерываниям или лучше использовать freeRTOS?

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

Чт мар 07, 2019 10:04:59

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

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

Чт мар 07, 2019 10:48:50

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

я с GSM-модулями ранее не имел дела и тоже предполагал, что они все одинаково стандартизованы, но первым делом перепаял вместо китайского модуля wismo-228 и устройство перестало работать. Посмотрел сниффером и увидел, что контроллер отправляет посылки в сторону модуля, но тот ему отвечает лишь в одном случае из 100. Перепаял обратно китайский модуль -- с ним работает. Несколько смутило два момента:
1) контроллер шлет некоторые команды, на которые также не отвечает китайский модуль;
2) все команды текстовые, но перед ними и после них присутствует несколько байтов;
3) модуль также отвечает текстовыми командами, но перед ними и после них также какие-то байты.

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

Чт мар 07, 2019 11:50:55

и как же вы планируете перекодировать на лету команды-ответы, если половина слов в вашем описании "какие-то"?

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

Чт мар 07, 2019 12:24:28

и как же вы планируете перекодировать на лету команды-ответы, если половина слов в вашем описании "какие-то"?

собираюсь через FTDI подключить к компу и попробовать с компа вычислить смысл и назначение этих неизвестных байтов, полагаю, что должен догадаться, но прежде хотел понять возможность реализации моими скромными силами перекодировщика на STC15W4K58S4 или STM32F030 и аналогичных, т.к. если получится, тогда хотелось бы на основе этого сделать себе разветвитель GPS-приемника от моего регистратора на два устройства, чтобы вторым концом подключить к магнитоле, поэтому устройство моего соседа рассматриваю в качестве стартового для первичного изучения работы с UART-ами на конкретной задаче...

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

Чт мар 07, 2019 12:36:27

неизвестные байты - это не 0x0D и 0x0A случайно? ;)

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

Чт мар 07, 2019 21:21:40

неизвестные байты - это не 0x0D и 0x0A случайно? ;)

нет, вернее эти в конце каждой тестовой строки тоже имеются, но перед каждой текстовой строкой что-то типа 0xAA,0x55,0xFD... и после 0x0D,0x0A тоже пару байтов (вечером заберу у соседа устройство и конкретно посмотрю на своем компе)

Добавлено after 8 hours 37 minutes 55 seconds:
посмотрю на своем компе)

подключил контроллер к компу через 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мсек;
далее все снова повторяется...

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

Пт мар 08, 2019 13:56:56

ПростоНуб писал(а):STM8S207/208 имеют по два UART и тоже дешевле STM32.
Сэкономив 10 рублей в ущерб производительности и доступным ресурсам.

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

Пт мар 08, 2019 16:45:04

ПростоНуб писал(а):STM8S207/208 имеют по два UART и тоже дешевле STM32.
Сэкономив 10 рублей в ущерб производительности и доступным ресурсам.

Вы из прошлого? Даже при прямой закупке партии в STMicro разница в цене между STM8S207/208 и STM32F103 двукратна или $1. Сейчас это свыше 66 рублей. И ради чего? Чтобы греть воздух?

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

Пт мар 08, 2019 16:49:15

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

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

Пт мар 08, 2019 20:36:01

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

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

Пт мар 08, 2019 21:10:14

ПростоНуб писал(а):Даже при прямой закупке партии в STMicro разница в цене между STM8S207/208 и STM32F103 двукратна или $1.
Цена STM32F103 около 1$ Хотите сказать что покупаете STM8 бесплатно? :shock: :)))


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Кбайт буфера хватит за глаза для любого применения.

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

Пт мар 08, 2019 21:32:29

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

Вы покупали у ST партию МК состоящую из 10000 шт.? Если нет, то к чему эти таблицы?

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

Пт мар 08, 2019 21:59:43

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

По ссылке перемаркированный CS32F103C8T6.


Вы же писали про STM32, а вовсе не о его китайском клоне, мало пригодном для практического применения ни с точки зрения энергопотребления, ни с точки зрения эксплуатационных температур.
Так и пишите в следующий раз, что речь о CS32, Но я бы, скорее, GD32 стал использовать, чем его )

Добавлено after 1 minute 30 seconds:
Вы покупали у ST партию МК состоящую из 10000 шт.? Если нет, то к чему эти таблицы?

Лично я - нет. Мой работодатель и ряд моих клиентов - да.

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

Пт мар 08, 2019 23:00:10

проблема у него на 100% не в типе микроконтроллера...

правильно подмечено -- у меня нет задачи массового производства, поэтому с учетом имеющихся у меня в шкафу нескольких разных микроконтроллеров 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 и перед отправкой в сторону контроллера "упаковывать" их согласно описанного выше.
Ответить