Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Отправка SMS кирилицей
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > Сотовая связь и ее приложения
blox
Извиняюсь за столь избитый вопрос,
подскажите пожайлуста как лучше работать с SMS на русском языке?
я только начал знакомиться с SIM300, видел что он будет снят с производства, но он у меня уже есть rolleyes.gif
SIM300 поддерживает передачу как в текстовом режиме так и в pdu, какой режим лучше выбрать?

*antzol*
Чтобы кирилицей - только pdu.
blox
Цитата(*antzol* @ Jul 25 2010, 01:27) *
Чтобы кирилицей - только pdu.

а в текстовом формате разве нельзя ? если использовать UCS2 или я что-то путаю?
*antzol*
Цитата(blox @ Jul 24 2010, 22:34) *
а в текстовом формате разве нельзя ? если использовать UCS2 или я что-то путаю?

Извиняюсь. Соврал.
Samodelkin
Цитата(blox @ Jul 24 2010, 21:34) *
а в текстовом формате разве нельзя ? если использовать UCS2 или я что-то путаю?


AT+CMGF=1
AT+CSCS="UCS2"
AT+CSMP=17,167,0,25

после этого можно отправлять и принимать сообщения на русском языке с Юникоде. Только и номер куда отправляется тоже набирать в Юникоде. При этом каждый символ придется передавать 4-мя байтами. Например цифра 1 будет выглядеть 0x30 0x30 0x33 0x31. А русская буква "А" - 0x30 0x34 0x31 0x30
blox
Большое спасибо за ответ!!! пока даже представления не имею о возможном кодирование и декодирование этого
формата подскажите что нужно посмотреть, почитать и какой из форматов будет менее проблемотичным со стороны
алгоритма.
Заранее Спасибо!!!
Samodelkin
Цитата(blox @ Jul 25 2010, 12:47) *
Большое спасибо за ответ!!! пока даже представления не имею о возможном кодирование и декодирование этого
формата подскажите что нужно посмотреть, почитать и какой из форматов будет менее проблемотичным со стороны
алгоритма.
Заранее Спасибо!!!


Реализуйте как вам кдобно. Просто берете код каждого русского символа в Юникоде (в инете этого полно) и ракладываете 2 байта на 4 полубайта и превращаете в указанный мной вид. И все.
blox
Цитата(Samodelkin @ Jul 25 2010, 19:48) *
Реализуйте как вам кдобно. Просто берете код каждого русского символа в Юникоде (в инете этого полно) и ракладываете 2 байта на 4 полубайта и превращаете в указанный мной вид. И все.

Извините пожайлуста, а почему нужно раскладывать два байта? один символ в UCS2 представлен двумя байтами,
я не понимаю help.gif
Samodelkin
Цитата(blox @ Jul 25 2010, 17:32) *
Извините пожайлуста, а почему нужно раскладывать два байта? один символ в UCS2 представлен двумя байтами,
я не понимаю help.gif


Ну я же написал!!!!!
Напрмер цифра 1 в юникоде выглядит так - 0х0031
но модуль принимает только ASCII символы. Вот и надо 0х0031 передать посимвольно "0" "0" "3" "1". Т.е. 0х30 0х30 0х33 0х31. И аналогичным образом все остальные симолы.
sobr
Может чем и поможет?
Master of Nature
Цитата(sobr @ Jul 26 2010, 07:04) *

Лучше скачайте оттуда и выложите сюда, т.к. там для скачивания требуется регистрация.
sobr
Цитата(Master of Nature @ Jul 26 2010, 12:20) *
Лучше скачайте оттуда и выложите сюда, т.к. там для скачивания требуется регистрация.

Зачем мне от туда скачивать, это моя утилита.Нажмите для просмотра прикрепленного файла
etoja
Вот официальные кодировки. Не забудьте прочитать параграф Terms of Use, где написано, что использование
этих кодировок в коммерческих целях требует письменного разрешения.
blox
А не подскажите каким лучше методом воспользоваться: создать таблицу и и сравнивать табличным методом или
есть более рациональные методы?
Master of Nature
Цитата(blox @ Jul 26 2010, 12:40) *
А не подскажите каким лучше методом воспользоваться: создать таблицу и и сравнивать табличным методом или
есть более рациональные методы?

Вообще-то коды можно пересчитывать из ASCII (как вариант) или как-то по-другому.
Но в любом случае, подумайте, а в каком виде вы будете вводить эти строки в программу?
Для автоматизированной обработки необязательно пользоваться русским языком. А для удобства восприятия - вы все равно сделаете набор строковых констант. Так что, достаточно один раз перекодировать.
Samodelkin
Цитата(blox @ Jul 26 2010, 10:40) *
А не подскажите каким лучше методом воспользоваться: создать таблицу и и сравнивать табличным методом или
есть более рациональные методы?


лично я на Си делаю так:


Data16 - 2-х байтовая переменная в которой находится символ в русской кодировке.

USART_Transmit(((Data16&0xF000)>>12)|0x30);
USART_Transmit(((Data16&0x0F00)>>8)|0x30);
USART_Transmit(((Data16&0x00F0)>>4)|0x30);
Data16 = Data16&0x000F;
if((Data16>=0) && (Data16<=9)) {USART_Transmit(Data16|0x30);}
else {USART_Transmit(Data16+0x37);}


В результате в модуль вместо 1-го двухбайтового значения отправляется 4 байта в кодировке ASCII
blox
Цитата(Master of Nature @ Jul 26 2010, 14:59) *
Вообще-то коды можно пересчитывать из ASCII (как вариант) или как-то по-другому.
Но в любом случае, подумайте, а в каком виде вы будете вводить эти строки в программу?
Для автоматизированной обработки необязательно пользоваться русским языком. А для удобства восприятия - вы все равно сделаете набор строковых констант. Так что, достаточно один раз перекодировать.

Да я так и думаю сделать, но пока ума не приложу как обрабатывать входные смс которые будут введены кирилицей.
Огромное спасибо за пример Samodelkin буду пробовать, пока ещё не всё понял, но в процессе думаю разберусь rolleyes.gif
sobr
Обратите Ваше внимание на буквы ё и Ё.
blox
Цитата(sobr @ Jul 26 2010, 18:09) *
Обратите Ваше внимание на буквы ё и Ё.

Спасибо!!! я уже заметил что Ё находиться в начале диапазона
Samodelkin
Цитата(blox @ Jul 26 2010, 14:06) *
Да я так и думаю сделать, но пока ума не приложу как обрабатывать входные смс которые будут введены кирилицей.
Огромное спасибо за пример Samodelkin буду пробовать, пока ещё не всё понял, но в процессе думаю разберусь rolleyes.gif


А это обратное преобразование. Т.е. из каждых 4-х байт одного символа из GSM модуля в формате ASCII формирование одного 16-разрядного символа в Юникоде. Например, из 4-х байт 0х30, 0х34, 0х31, 0х30 формируеься один байт 0х0410 что соответствует букве "А" русского алфавита. На изящность програмного решения не претендую. Но работает без проблем.

unsigned int dig1 = перый символ из 4-х
unsigned int dig2 = второй символ из 4-х
unsigned int dig3 = третий символ из 4-х
unsigned int dig4 = четвертый символ из 4-х

if((dig1 >= 0x30) && (dig1 <= 0x39)) {dig1 = 0x000F&dig1;}
else if((dig1 >= 0x41) && (dig1 <= 0x46)) {dig1 -= 0x37;}
if((dig2 >= 0x30) && (dig2 <= 0x39)) {dig2 = 0x000F&dig2;}
else if((dig2 >= 0x41) && (dig2 <= 0x46)) {dig2 -= 0x37;}
if((dig3 >= 0x30) && (dig3 <= 0x39)) {dig3 = 0x000F&dig3;}
else if((dig3 >= 0x41) && (dig3 <= 0x46)) {dig3 -= 0x37;}
if((dig4 >= 0x30) && (dig4 <= 0x39)) {dig4 = 0x000F&dig4;}
else if((dig4 >= 0x41) && (dig4 <= 0x46)) {dig4 -= 0x37;}
dig1 = (dig1<<12) + (dig2<<8) + (dig3<<4) + dig4;

В результате в переменной dig1 будет содержаться тот самый 16-разрядный символ в Юникоде
Собственно говоря такую процедуру надо провести для всех блоков по 4 байта в принятом SMS. Это чтоб потом можно было сравнивать с образцовой строкой из памяти программ или EEPROM, например.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.