SIM800L SMS сообщения PDU декодирование кириллица Cyrillic UCS2 format Arduino Decode sms messages

Опубликовано: 26 Декабрь 2020
на канале: Дмитрий Осипов
450
11

https://drive.google.com/drive/folder...
SMS_PDU_Decode_Cyrillic_Arduino_SIM800L_2020_12_26.ino
/*
SMS_PDU_Decode_Cyrillic_Arduino_SIM800L_2020_12_26
декодирование sms-сообщения PDU / UCS2 формата кириллица
decoding of sms-messages PDU / UCS2 in Cyrillic format
arduino IDE-1.6.12

https://drive.google.com/drive/folder...
SMS_PDU_Decode_Cyrillic_Arduino_SIM800L_2020_12_26.ino
https://drive.google.com/drive/folder...
*/

#include ◄SoftwareSerial.h► // библиотека для программного Serial - UART
SoftwareSerial mySerial(2, 3); // Соединяем (RX SIM800L TX) с (3-Pin Arduino 2-Pin) AT
#define SERIAL_BAUD 4800 // скорость Serial

#define RESPONSE_NEW_SMS "+CMT:" // УВЕДОМЛЕНИЕ - пришло оповещение о новом SMS

// 1 символ UCS2 PDU занимает 2 байта, каждый байт в HEX-формате. итого 1 символ занимает 4 знака .
char arrResultDecodeUCS2PDU[99] {NULL}; // массив для хранения, декодированных 4 знаков UCS2 PDU, в 1 байт, в кириллице - латиницы
int indexArrResult = -1; // счетчик индекса массива
char arrUCS2[5]; // массив для хранения принятого 1 символа UCS2 (4 знака) от SIM800L

void FOO_PDUdecode();
void setup() {
Serial.begin(SERIAL_BAUD);
mySerial.begin(SERIAL_BAUD);

while (1) {
if (Serial.available())mySerial.write(Serial.read());

if (mySerial.available()) {
Serial.write(mySerial.peek());
arrResultDecodeUCS2PDU[++indexArrResult] = mySerial.read();
if ((arrResultDecodeUCS2PDU[indexArrResult] == '\n') && (arrResultDecodeUCS2PDU[indexArrResult - 1] == '\r')) {
arrResultDecodeUCS2PDU[indexArrResult - 1] = NULL;
indexArrResult = - 1;
if (memcmp_P(arrResultDecodeUCS2PDU, PSTR(RESPONSE_NEW_SMS), sizeof(RESPONSE_NEW_SMS) - 1) == 0) { //оповещение о новом SMS
arrResultDecodeUCS2PDU[0] = NULL;
FOO_PDUdecode();
}
}
}
}

}

void loop() {}



void FOO_PDUdecode() {
char UCS2ToChar = NULL;
indexArrResult = -1;
int indexArrUCS2 = -1;
while (1) {
if (mySerial.available()) {
arrUCS2[++indexArrUCS2] = (char)mySerial.read();
Serial.write(arrUCS2[indexArrUCS2]);

if ((arrUCS2[indexArrUCS2] == '\n') && (arrUCS2[indexArrUCS2 - 1] == '\r')) {
arrResultDecodeUCS2PDU[indexArrResult + 1] = NULL;
Serial.println(arrResultDecodeUCS2PDU);
if (UCS2ToChar == NULL)Serial.println(F("NOT Decode")); // если декодирования не было
return;
}

if (indexArrUCS2 ► 2) { // если приняли (4 байта / знака) (1 символа UCS2) например ((char)-'R' = 0052-(UCS2))

if (arrUCS2[1] == '0') { // если латиница. если 2-рой знак символа UCS2 = '0'. Значить символ UCS2 латиница
UCS2ToChar = ((arrUCS2[2] - '0') * 16); // 3-тий знак символа (UCS2 латиница), преобразуем сохраняем
if (arrUCS2[3] ► '9')UCS2ToChar += (arrUCS2[3] - 55); // если 4-тый (знак UCS2), HEX-формата A,B,C.D,E.F
else UCS2ToChar += (arrUCS2[3] - '0'); // если 4-тый (знак UCS2), HEX-формата (0-9)
arrResultDecodeUCS2PDU[++indexArrResult] = (char)UCS2ToChar; // сохраняем
Serial.write('\t');
}

else if (arrUCS2[1] == '4') { // если кириллица. если 2-рой знак символа UCS2 = '4'. (таблица символов UCS2)
if (arrUCS2[2] == '0')UCS2ToChar = 89;
else if (arrUCS2[2] == '1')UCS2ToChar = 64;
else if (arrUCS2[2] == '2')UCS2ToChar = 48;
else if (arrUCS2[2] == '3')UCS2ToChar = 32;
else if (arrUCS2[2] == '4')UCS2ToChar = 16;
else if (arrUCS2[2] == '5')UCS2ToChar = 73;


if (arrUCS2[3] ► '9')UCS2ToChar -= (arrUCS2[3] - 55);
else UCS2ToChar -= (arrUCS2[3] - '0');

UCS2ToChar = -UCS2ToChar; // инвертируем данные
arrResultDecodeUCS2PDU[++indexArrResult] = (char)UCS2ToChar;
Serial.write('\t');
}


else if (memcmp_P(arrUCS2, PSTR("2116"), 4) == 0) { // Символ № - если Символ вне общего правила
arrResultDecodeUCS2PDU[++indexArrResult] = -71;
}

indexArrUCS2 = -1;

}
}
}
}

Ссылка на видео:
   • SIM800L SMS сообщения PDU декодирован...