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.
Cookies are required to use this site. You must accept them to continue using the site. Learn more…