GSM模块支持两种发送短信的模式,即TEXT模式与PDU模式。
1)TEXT模式,即文本模式,一般来说该模式只支持英文字母及数字,还有个别标点符号,不过也有个别模块可以支持发送中文的,像龙尚的A8000。在这种模式下,一般使用的字符编码规则是"GSM"。"GSM"字符编码又分了8bit编码及7bit编码两种,在8bit编码模式下,短信息的长度最长是140个字符,由于这些字符其实都属于基本ASCII码的范围,故可以用7bit来表示一个字符,所以在7bit编码下,原来140个字符的空间可以容纳下(140*8)/7=160个字符的数据,即可以发送160个字符长度的短信。这就是为什么不同型号的手机在发送英文短信时,有的一条最长发出140个字符,有的最长能发出160个字符了,是因为使用的编码规则不一样。
2)PDU模式,协议数据单元模式(Protocol Data Unit),在该模式下可以发送中文的汉字。在该模式下使用的字符编码规则有很多种,但各种模块一般都会支持最通用的一种:"UCS2"编码,即用2个字节来编码的“万国码”。在该模式下,必须输入汉字的UCS2编码,一个汉字被编码成2个字节的数据,也就是说,短信的长度被缩短成了140/2=70个汉字了(在该编码规则下,英文字母也占了两个字节,只是其中一个字节是0x0而已)。在PDU模式下,被发送的短信,要通过一定的规则打包成PDU数据才能发送,这个PDU数据中包含的主要信息有:信息中心号码、对方手机号、信息有效期、字符编码规则、信息数据等等。
在使用GSM模块发短信时,一般情况下,短信的模式是由指令"AT+CMGF"来设置的。对于TEXT模式,短信的字符编码规则是通过指令"AT+CSCS="GSM" "来设置字符集,并通过指令"AT+CSMP"设置DCS(Data Coding Scheme)字段来设置8bit编码还是7bit编码;对于PDU格式,短信的字符编码规则是通过指令"AT+CSCS="UCS2" "来设置字符集的,并且在PDU数据中的DCS字段也要做相应的设置。
一般的情况下,汉字的内码使用的是GBK编码,例如,使用串口终端向单片机发送汉字时,单片机收到的就是汉字的GBK编码。GBK编码要转化为UCS2编码就必须使用查表的方法实现,二分查表法是一个不错的查表方法,速度极快。昨天写了个GB2312编码(GBK编码的一个子集)转UCS2编码的C语言程序,提供了GB2312规定的6763个常用汉字的支持,我把它放在资料共享里了,如果有需要的朋友,可以下载使用,也可以在代码中添加其它的字符支持。(GBK其实支持20902个字的,只是其中包含的很多东西,如日文、韩文、希腊字母、符号等不常用)