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
PDUCONV.C
wait for you help
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: