Перейти к содержанию
    

Отправка SMS кирилицей

А не подскажите каким лучше методом воспользоваться: создать таблицу и и сравнивать табличным методом или

есть более рациональные методы?

 

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

 

 

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

Изменено пользователем Samodelkin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще-то коды можно пересчитывать из ASCII (как вариант) или как-то по-другому.

Но в любом случае, подумайте, а в каком виде вы будете вводить эти строки в программу?

Для автоматизированной обработки необязательно пользоваться русским языком. А для удобства восприятия - вы все равно сделаете набор строковых констант. Так что, достаточно один раз перекодировать.

Да я так и думаю сделать, но пока ума не приложу как обрабатывать входные смс которые будут введены кирилицей.

Огромное спасибо за пример Samodelkin буду пробовать, пока ещё не всё понял, но в процессе думаю разберусь :rolleyes:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обратите Ваше внимание на буквы ё и Ё.

Спасибо!!! я уже заметил что Ё находиться в начале диапазона

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да я так и думаю сделать, но пока ума не приложу как обрабатывать входные смс которые будут введены кирилицей.

Огромное спасибо за пример Samodelkin буду пробовать, пока ещё не всё понял, но в процессе думаю разберусь :rolleyes:

 

А это обратное преобразование. Т.е. из каждых 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, например.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...