Samodelkin 0 26 июля, 2010 Опубликовано 26 июля, 2010 (изменено) · Жалоба А не подскажите каким лучше методом воспользоваться: создать таблицу и и сравнивать табличным методом или есть более рациональные методы? лично я на Си делаю так: 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 Изменено 26 июля, 2010 пользователем Samodelkin Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
blox 0 26 июля, 2010 Опубликовано 26 июля, 2010 · Жалоба Вообще-то коды можно пересчитывать из ASCII (как вариант) или как-то по-другому. Но в любом случае, подумайте, а в каком виде вы будете вводить эти строки в программу? Для автоматизированной обработки необязательно пользоваться русским языком. А для удобства восприятия - вы все равно сделаете набор строковых констант. Так что, достаточно один раз перекодировать. Да я так и думаю сделать, но пока ума не приложу как обрабатывать входные смс которые будут введены кирилицей. Огромное спасибо за пример Samodelkin буду пробовать, пока ещё не всё понял, но в процессе думаю разберусь :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sobr 0 26 июля, 2010 Опубликовано 26 июля, 2010 · Жалоба Обратите Ваше внимание на буквы ё и Ё. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
blox 0 26 июля, 2010 Опубликовано 26 июля, 2010 · Жалоба Обратите Ваше внимание на буквы ё и Ё. Спасибо!!! я уже заметил что Ё находиться в начале диапазона Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Samodelkin 0 26 июля, 2010 Опубликовано 26 июля, 2010 · Жалоба Да я так и думаю сделать, но пока ума не приложу как обрабатывать входные смс которые будут введены кирилицей. Огромное спасибо за пример 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, например. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться