Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

PDU mode algorithm for PIC & Cellphone

Status
Not open for further replies.

terka

New Member
Hi

I found a code to translate a ASCII string to PDU string.
You can download it from: **broken link removed**
It´s made for PC, and I had modified it to use on a PIC 18F242, because expensive memory use...


Well, I had compiled my code on CCS 3.322, and ist not working very well.....

Example: ascii string ===> buffer[]="hellohello" from
https://www.dreamfabric.com/sms/hello.html
in PDU must be: E8 32 9B FD 46 97 D9 EC 37

but the result in my code is: 6F 4A 4B 4C 4D 4E 4F 50 51

I think than problem is how CCS drives the pointer and array, can you help me??


Thank you...


my code is:

MAIN.C

Code:
#include <18F242.h> 
#fuses NOWDT,WDT128,XT, NOPROTECT, NOOSCSEN, BROWNOUT, BORV42, PUT, NOEBTR, NOEBTRB 
#fuses STVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOWRTB, NOWRTC, NOCPD, NOCPB 
#use delay(clock=4000000) 
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) 
#include "pduconv.c"  

void main() 
{ 
   int i; 
   int pdulen=0; 
   unsigned char *pdu; 
   char buffer[]="hellohello"; 
   printf("Text to convert:\n\r\r"); 
    
   printf("%s\n\r\r",buffer);      
   printf("The result string is:\n\r\r"); 
    
   pdulen=ascii_to_pdu(buffer,&pdu); 
   for (i=0; i<pdulen;i++) 
   { 
   printf("%02X",pdu[i]); 
   // Originally, the previous code is the following one: 
   // printf("%02hX",pdu[i]); 
   // it works correctly compiled for windows but CCS does not 
   // recognize the previous thing 
   } 
      printf("The length of the buffer-pdu is: %i bytes", pdulen); 
   //the function operates correctly on having found the length of the buffer PDU 
   free(pdu); 

}

PDUCONV.C

Code:
/*************************************************************************** 
 * 
 * Functions for converting between an ISO-8859-1 ASCII string and a 
 * PDU-coded string as described in ETSI GSM 03.38 and ETSI GSM 03.40. 
 * 
 * This code is released to the public domain in 2003 by Mats Engstrom, 
 * Nerdlabs Consulting. ( matseng at nerdlabs dot org ) 
 * 
 **************************************************************************/ 
#include <stdlib.h>   //It contains the function abs (); 
#include <stdlibm.h> //It contains the function malloc ()/realloc ()/fre () for CCS 
#define VERSION 0.1 

/* Define Non-Printable Characters as a question mark */ 
#define NPC7    63 
#define NPC8    '?' 
**************************************************************************** 
    This lookup table converts from ISO-8859-1 8-bit ASCII to the 
    7 bit "default alphabet" as defined in ETSI GSM 03.38 

    ISO-characters that don't have any correspondning character in the 
    7-bit alphabet is replaced with the NPC7-character.  If there's 
    a close match between the ISO-char and a 7-bit character (for example 
    the letter i with a circumflex and the plain i-character) a substitution 
    is done. These "close-matches" are marked in the lookup table by 
    having its value negated. 

    There are some character (for example the curly brace "}") that must 
    be converted into a 2 byte 7-bit sequence.  These characters are 
    marked in the table by having 256 added to its value. 
****************************************************************************/ 

int lookup_ascii8to7[]={ 
    NPC7,       /*     0      null [NUL]                              */ 
    NPC7,       /*     1      start of heading [SOH]                  */ 
    NPC7,       /*     2      start of text [STX]                     */ 
    NPC7,       /*     3      end of text [ETX]                       */ 
    NPC7,       /*     4      end of transmission [EOT]               */ 
    NPC7,       /*     5      enquiry [ENQ]                           */ 
    NPC7,       /*     6      acknowledge [ACK]                       */ 
    NPC7,       /*     7      bell [BEL]                              */ 
    NPC7,       /*     8      backspace [BS]                          */ 
    NPC7,       /*     9      horizontal tab [HT]                     */ 
    10,         /*    10      line feed [LF]                          */ 
    NPC7,       /*    11      vertical tab [VT]                       */ 
    10+256,     /*    12      form feed [FF]                          */ 
    13,         /*    13      carriage return [CR]                    */ 
    NPC7,       /*    14      shift out [SO]                          */ 
    NPC7,       /*    15      shift in [SI]                           */ 
    NPC7,       /*    16      data link escape [DLE]                  */ 
    NPC7,       /*    17      device control 1 [DC1]                  */ 
    NPC7,       /*    18      device control 2 [DC2]                  */ 
    NPC7,       /*    19      device control 3 [DC3]                  */ 
    NPC7,       /*    20      device control 4 [DC4]                  */ 
    NPC7,       /*    21      negative acknowledge [NAK]              */ 
    NPC7,       /*    22      synchronous idle [SYN]                  */ 
    NPC7,       /*    23      end of trans. block [ETB]               */ 
    NPC7,       /*    24      cancel [CAN]                            */ 
    NPC7,       /*    25      end of medium [EM]                      */ 
    NPC7,       /*    26      substitute [SUB]                        */ 
    NPC7,       /*    27      escape [ESC]                            */ 
    NPC7,       /*    28      file separator [FS]                     */ 
    NPC7,       /*    29      group separator [GS]                    */ 
    NPC7,       /*    30      record separator [RS]                   */ 
    NPC7,       /*    31      unit separator [US]                     */ 
    32,         /*    32      space                                   */ 
    33,         /*    33    ! exclamation mark                        */ 
    34,         /*    34    " double quotation mark                   */ 
    35,         /*    35    # number sign                             */ 
    2,          /*    36    $ dollar sign                             */ 
    37,         /*    37    % percent sign                            */ 
    38,         /*    38    & ampersand                               */ 
    39,         /*    39    ' apostrophe                              */ 
    40,         /*    40    ( left parenthesis                        */ 
    41,         /*    41    ) right parenthesis                       */ 
    42,         /*    42    * asterisk                                */ 
    43,         /*    43    + plus sign                               */ 
    44,         /*    44    , comma                                   */ 
    45,         /*    45    - hyphen                                  */ 
    46,         /*    46    . period                                  */ 
    47,         /*    47    / slash,                                  */ 
    48,         /*    48    0 digit 0                                 */ 
    49,         /*    49    1 digit 1                                 */ 
    50,         /*    50    2 digit 2                                 */ 
    51,         /*    51    3 digit 3                                 */ 
    52,         /*    52    4 digit 4                                 */ 
    53,         /*    53    5 digit 5                                 */ 
    54,         /*    54    6 digit 6                                 */ 
    55,         /*    55    7 digit 7                                 */ 
    56,         /*    56    8 digit 8                                 */ 
    57,         /*    57    9 digit 9                                 */ 
    58,         /*    58    : colon                                   */ 
    59,         /*    59    ; semicolon                               */ 
    60,         /*    60    < less-than sign                          */ 
    61,         /*    61    = equal sign                              */ 
    62,         /*    62    > greater-than sign                       */ 
    63,         /*    63    ? question mark                           */ 
    0,          /*    64    @ commercial at sign                      */ 
    65,         /*    65    A uppercase A                             */ 
    66,         /*    66    B uppercase B                             */ 
    67,         /*    67    C uppercase C                             */ 
    68,         /*    68    D uppercase D                             */ 
    69,         /*    69    E uppercase E                             */ 
    70,         /*    70    F uppercase F                             */ 
    71,         /*    71    G uppercase G                             */ 
    72,         /*    72    H uppercase H                             */ 
    73,         /*    73    I uppercase I                             */ 
    74,         /*    74    J uppercase J                             */ 
    75,         /*    75    K uppercase K                             */ 
    76,         /*    76    L uppercase L                             */ 
    77,         /*    77    M uppercase M                             */ 
    78,         /*    78    N uppercase N                             */ 
    79,         /*    79    O uppercase O                             */ 
    80,         /*    80    P uppercase P                             */ 
    81,         /*    81    Q uppercase Q                             */ 
    82,         /*    82    R uppercase R                             */ 
    83,         /*    83    S uppercase S                             */ 
    84,         /*    84    T uppercase T                             */ 
    85,         /*    85    U uppercase U                             */ 
    86,         /*    86    V uppercase V                             */ 
    87,         /*    87    W uppercase W                             */ 
    88,         /*    88    X uppercase X                             */ 
    89,         /*    89    Y uppercase Y                             */ 
    90,         /*    90    Z uppercase Z                             */ 
    60+256,     /*    91    [ left square bracket                     */ 
    47+256,     /*    92    \ backslash                               */ 
    62+256,     /*    93    ] right square bracket                    */ 
    20+256,     /*    94    ^ circumflex accent                       */ 
    17,         /*    95    _ underscore                              */ 
    -39,        /*    96    ` back apostrophe                         */ 
    97,         /*    97    a lowercase a                             */ 
    98,         /*    98    b lowercase b                             */ 
    99,         /*    99    c lowercase c                             */ 
    100,        /*   100    d lowercase d                             */ 
    101,        /*   101    e lowercase e                             */ 
    102,        /*   102    f lowercase f                             */ 
    103,        /*   103    g lowercase g                             */ 
    104,        /*   104    h lowercase h                             */ 
    105,        /*   105    i lowercase i                             */ 
    106,        /*   106    j lowercase j                             */ 
    107,        /*   107    k lowercase k                             */ 
    108,        /*   108    l lowercase l                             */ 
    109,        /*   109    m lowercase m                             */ 
    110,        /*   110    n lowercase n                             */ 
    111,        /*   111    o lowercase o                             */ 
    112,        /*   112    p lowercase p                             */ 
    113,        /*   113    q lowercase q                             */ 
    114,        /*   114    r lowercase r                             */ 
    115,        /*   115    s lowercase s                             */ 
    116,        /*   116    t lowercase t                             */ 
    117,        /*   117    u lowercase u                             */ 
    118,        /*   118    v lowercase v                             */ 
    119,        /*   119    w lowercase w                             */ 
    120,        /*   120    x lowercase x                             */ 
    121,        /*   121    y lowercase y                             */ 
    122,        /*   122    z lowercase z                             */ 
    40+256,     /*   123    { left brace                              */ 
    64+256,     /*   124    | vertical bar                            */ 
    41+256,     /*   125    } right brace                             */ 
    61+256,     /*   126    ~ tilde accent                            */ 
    NPC7,       /*   127      delete [DEL]                            */ 
    NPC7,       /*   128                                              */ 
    NPC7,       /*   129                                              */ 
    -39,        /*   130      low left rising single quote            */ 
    -102,       /*   131      lowercase italic f                      */ 
    -34,        /*   132      low left rising double quote            */ 
    NPC7,       /*   133      low horizontal ellipsis                 */ 
    NPC7,       /*   134      dagger mark                             */ 
    NPC7,       /*   135      double dagger mark                      */ 
    NPC7,       /*   136      letter modifying circumflex             */ 
    NPC7,       /*   137      per thousand (mille) sign               */ 
    -83,        /*   138      uppercase S caron or hacek              */ 
    -39,        /*   139      left single angle quote mark            */ 
    -214,       /*   140      uppercase OE ligature                   */ 
    NPC7,       /*   141                                              */ 
    NPC7,       /*   142                                              */ 
    NPC7,       /*   143                                              */ 
    NPC7,       /*   144                                              */ 
    -39,        /*   145      left single quotation mark              */ 
    -39,        /*   146      right single quote mark                 */ 
    -34,        /*   147      left double quotation mark              */ 
    -34,        /*   148      right double quote mark                 */ 
    -42,        /*   149      round filled bullet                     */ 
    -45,        /*   150      en dash                                 */ 
    -45,        /*   151      em dash                                 */ 
    -39,        /*   152      small spacing tilde accent              */ 
    NPC7,       /*   153      trademark sign                          */ 
    -115,       /*   154      lowercase s caron or hacek              */ 
    -39,        /*   155      right single angle quote mark           */ 
    -111,       /*   156      lowercase oe ligature                   */ 
    NPC7,       /*   157                                              */ 
    NPC7,       /*   158                                              */ 
    -89,        /*   159      uppercase Y dieresis or umlaut          */ 
    -32,        /*   160      non-breaking space                      */ 
    64,         /*   161    ¡ inverted exclamation mark               */ 
    -99,        /*   162    ¢ cent sign                               */ 
    1,          /*   163    £ pound sterling sign                     */ 
    36,         /*   164    ¤ general currency sign                   */ 
    3,          /*   165    ¥ yen sign                                */ 
    -33,        /*   166    ¦ broken vertical bar                     */ 
    95,         /*   167    § section sign                            */ 
    -34,        /*   168    ¨ spacing dieresis or umlaut              */ 
    NPC7,       /*   169    © copyright sign                          */ 
    NPC7,       /*   170    ª feminine ordinal indicator              */ 
    -60,        /*   171    « left (double) angle quote               */ 
    NPC7,       /*   172    ¬ logical not sign                        */ 
    -45,        /*   173     soft hyphen                             */ 
    NPC7,       /*   174    ® registered trademark sign               */ 
    NPC7,       /*   175    ¯ spacing macron (long) accent            */ 
    NPC7,       /*   176    ° degree sign                             */ 
    NPC7,       /*   177    ± plus-or-minus sign                      */ 
    -50,        /*   178    ² superscript 2                           */ 
    -51,        /*   179    ³ superscript 3                           */ 
    -39,        /*   180    ´ spacing acute accent                    */ 
    -117,       /*   181    µ micro sign                              */ 
    NPC7,       /*   182    ¶ paragraph sign, pilcrow sign            */ 
    NPC7,       /*   183    · middle dot, centered dot                */ 
    NPC7,       /*   184    ¸ spacing cedilla                         */ 
    -49,        /*   185    ¹ superscript 1                           */ 
    NPC7,       /*   186    º masculine ordinal indicator             */ 
    -62,        /*   187    » right (double) angle quote (guillemet)  */ 
    NPC7,       /*   188    ¼ fraction 1/4                            */ 
    NPC7,       /*   189    ½ fraction 1/2                            */ 
    NPC7,       /*   190    ¾ fraction 3/4                            */ 
    96,         /*   191    ¿ inverted question mark                  */ 
    -65,        /*   192    À uppercase A grave                       */ 
    -65,        /*   193    Á uppercase A acute                       */ 
    -65,        /*   194    Â uppercase A circumflex                  */ 
    -65,        /*   195    Ã uppercase A tilde                       */ 
    91,         /*   196    Ä uppercase A dieresis or umlaut          */ 
    14,         /*   197    Å uppercase A ring                        */ 
    28,         /*   198    Æ uppercase AE ligature                   */ 
    9,          /*   199    Ç uppercase C cedilla                     */ 
    -31,        /*   200    È uppercase E grave                       */ 
    31,         /*   201    É uppercase E acute                       */ 
    -31,        /*   202    Ê uppercase E circumflex                  */ 
    -31,        /*   203    Ë uppercase E dieresis or umlaut          */ 
    -73,        /*   204    Ì uppercase I grave                       */ 
    -73,        /*   205    Í uppercase I acute                       */ 
    -73,        /*   206    Î uppercase I circumflex                  */ 
    -73,        /*   207    Ï uppercase I dieresis or umlaut          */ 
    -68,        /*   208    Ð uppercase ETH                           */ 
    93,         /*   209    Ñ uppercase N tilde                       */ 
    -79,        /*   210    Ò uppercase O grave                       */ 
    -79,        /*   211    Ó uppercase O acute                       */ 
    -79,        /*   212    Ô uppercase O circumflex                  */ 
    -79,        /*   213    Õ uppercase O tilde                       */ 
    92,         /*   214    Ö uppercase O dieresis or umlaut          */ 
    -42,        /*   215    × multiplication sign                     */ 
    11,         /*   216    Ø uppercase O slash                       */ 
    -85,        /*   217    Ù uppercase U grave                       */ 
    -85,        /*   218    Ú uppercase U acute                       */ 
    -85,        /*   219    Û uppercase U circumflex                  */ 
    94,         /*   220    Ü uppercase U dieresis or umlaut          */ 
    -89,        /*   221    Ý uppercase Y acute                       */ 
    NPC7,       /*   222    Þ uppercase THORN                         */ 
    30,         /*   223    ß lowercase sharp s, sz ligature          */ 
    127,        /*   224    à lowercase a grave                       */ 
    -97,        /*   225    á lowercase a acute                       */ 
    -97,        /*   226    â lowercase a circumflex                  */ 
    -97,        /*   227    ã lowercase a tilde                       */ 
    123,        /*   228    ä lowercase a dieresis or umlaut          */ 
    15,         /*   229    å lowercase a ring                        */ 
    29,         /*   230    æ lowercase ae ligature                   */ 
    -9,         /*   231    ç lowercase c cedilla                     */ 
    4,          /*   232    è lowercase e grave                       */ 
    5,          /*   233    é lowercase e acute                       */ 
    -101,       /*   234    ê lowercase e circumflex                  */ 
    -101,       /*   235    ë lowercase e dieresis or umlaut          */ 
    7,          /*   236    ì lowercase i grave                       */ 
    7,          /*   237    í lowercase i acute                       */ 
    -105,       /*   238    î lowercase i circumflex                  */ 
    -105,       /*   239    ï lowercase i dieresis or umlaut          */ 
    NPC7,       /*   240    ð lowercase eth                           */ 
    125,        /*   241    ñ lowercase n tilde                       */ 
    8,          /*   242    ò lowercase o grave                       */ 
    -111,       /*   243    ó lowercase o acute                       */ 
    -111,       /*   244    ô lowercase o circumflex                  */ 
    -111,       /*   245    õ lowercase o tilde                       */ 
    124,        /*   246    ö lowercase o dieresis or umlaut          */ 
    -47,        /*   247    ÷ division sign                           */ 
    12,         /*   248    ø lowercase o slash                       */ 
    6,          /*   249    ù lowercase u grave                       */ 
    -117,       /*   250    ú lowercase u acute                       */ 
    -117,       /*   251    û lowercase u circumflex                  */ 
    126,        /*   252    ü lowercase u dieresis or umlaut          */ 
    -121,       /*   253    ý lowercase y acute                       */ 
    NPC7,       /*   254    þ lowercase thorn                         */ 
    -121        /*   255    ÿ lowercase y dieresis or umlaut          */ 
}; 



/* 
 * Use a lookup table to convert from an ISO-8859-1 string to 
 * the 7-bit default alphabet used by SMS. 
 * 
 *  *ascii   The string to convert 
 * 
 *  **a7bit  A pointer to the array that the result is stored in, 
 *           the space is malloced by this function 
 * 
 *  Returns the length of the a7bit-array 

* Realized changes: 
 * 
 * *ascii ==> I have supported it without changes 
 * ** a7bit ==> I changed it to *a7bit [] 
 * 

 * 
 *  Note:  The a7bit-array must be free()'ed by te caller 
 */ 


static int convert_ascii_to_7bit(char *ascii, char *a7bit[]){ 
    int r=0; 
    int w=0; 

    /* It locates sufficient memory for the resultant string */ 
    *a7bit=malloc(strlen(ascii)*2+1);   // sin cambios 

    while (ascii[r]!=0) { 
        if ((lookup_ascii8to7[(unsigned char)ascii[r]])<256) { 
            *a7bit[w++]=abs(lookup_ascii8to7[(unsigned char)ascii[r++]]); 
          //*a7bit[w++] was (*a7bit)[w++] 
        } else { 
            *a7bit[w++]=27; 
            //idem 
            *a7bit[w++]=lookup_ascii8to7[(unsigned char)ascii[r++]]-256; 
           //idem 
           } 
    } 

    /* Realloc the result array to the correct size */ 
    *a7bit=realloc(*a7bit,w);  //sin cambios 

    return w; 
} 


/* 
 *  Convert an ISO-8859-1 ASCII string to an array of PDU-coded bytes 
 * 
 *  *ascii  The ISO-cleartext to convert 
 * 
 *  **pdu   Pointer to an array where the pdu-bytes will be stored in, this 
 *          function allocates the neccesary memory for the array 
 * 
 *  Returns the number of bytes stored in the pdu-array 
* 
 * NOTE: Here I changed ** pdu for *pdu [], for CCS. Not if it is correct 
 * to support the integrity of the program 
 * 
 * It returns the number of bytes stored in the arrangement PDU 
 * 


int ascii_to_pdu(char *ascii, unsigned char *pdu[]){ 
    int r; 
    int w; 
    char *ascii7bit;  //no changes 
    int  len7bit;     //no changes 

    /* start  converting the string ASCII to a string of 7bit*/ 
    len7bit=convert_ascii_to_7bit(ascii,&ascii7bit); 
    *pdu=malloc(len7bit);  //no changes 

    /* Now, to create the string PDU enpaquetando the string of 7bit*/ 
    r=0; 
    w=0; 
    while (r<len7bit) { 

        *pdu[w]=((ascii7bit[r]>>(w%7))&0x7F) | ((ascii7bit[r+1]<<(7-(w%7)))&0xFF); 

       //*pdu[w] was (*pdu)[w] 

        if ((w%7)==6) r++; 
        r++; 
        w++; 
    } 

    free(ascii7bit); 
    return w;  // w is the number of bytes stored in the areglo PDU. 
}

wait for you help
 
Last edited by a moderator:
Status
Not open for further replies.

Latest threads

New Articles From Microcontroller Tips

Back
Top