CDMA猫用AT命令发中文短信(转)

CDMA猫用AT命令发中文短信(C#)

http://www.cublog.cn/u1/38200/showart_2211241.html

CDMA猫,只能发文本短信。发中文短信居然是UNICODE而不是PDU,无法在超级终端里输入。只能写程序。
网上这个问题谈论地比较多,做起来比较累,还偶尔会出乱码。还是将C#的成功代码帖一下吧。
转载请注明来源
void SendCHNSms(string content,string phone)
{
//中文CDMA发送,UNICODE编码字节
byte[] b = Encoding.BigEndianUnicode.GetBytes(content);
//CDMA的AT命令手机号码前面不能加86,否则虽然显示成功发送,但短信中心回应错误代码5
if(phone.IndexOf("86")==0)
{
phone
= phone.Substring(2);
}
//假设是COM3口
SerialPort sp = new SerialPort("com3");
//和GSM猫不同,波特率是115200,这个问题困扰了很久的说
sp.BaudRate = 115200;
sp.Open();
//设置中文短信
sp.Write("AT+WSCL=6,4\r");
Thread.Sleep(
500);
//设置文本格式短信
sp.Write("AT+CMGF=1\r");
Thread.Sleep(
500);
//设置发送的号码和发送内容字节长度
sp.Write("AT+CMGS=\"" + phone + "\"," + b.Length + "\r");
Thread.Sleep(
500);
//写入
sp.Write(b, 0, b.Length);
Thread.Sleep(
500);
//写入CTRL+Z结束短信内容,注意在UNICODE模式下需要两个字节,这个也是不能在超级终端下操作的原因
byte[] b2 = new byte[] { 0x00, 0x1a };
sp.Write(b2,
0, b2.Length);
sp.Close();
}
 
————————————————————————————————————————————————————————————
我的心得:
波特率不一定是115200,要看不同厂家的猫出厂设置,有可能是9600或者其他。
"AT+CMGS=“”----直接加入电话号码,不加信文长度也可以发送成功
直接对中文发送时,会出现乱码,在最后一个字符时,加一个空格,就可以避免乱码。
 
—————————————————————————————————————————————————————————————
过去的手动编码方式(相当于上面代码中BigEndianUnicode)
 
private string GetMessage(string strValue)
{
string strTemp= " ";
int iLen=0;
Byte[] bt
=new Byte [1024];
Byte btTemp
=new Byte();
string strValue1=strValue;
System.Text .Encoding .Unicode .GetBytes (strValue1,
0,strValue1.Length ,bt,0);
for(int i=0;i <bt.Length ;i=i+2)
{
if(bt[i]==0 && bt[i+1]==0)
{
iLen
=i;
i
=bt.Length ;

}
else
{
btTemp
=bt[i];
bt[i]
=bt[i+1];
bt[i
+1]=btTemp;
}
}

//c#中默认编码为unicode
strTemp=System.Text .Encoding .Default.GetString (bt,0,iLen);

return strTemp;

}
 
常用编码格式介绍
ASCII:
美国率先开始的编码方式,每个byte表示一个字符,其中最高位为0没有使用,编码范围是0×00-0×7F(127个),ASCII字符集包括英文字母、阿拉伯数字和标点符号等字符。其中0×00-0×20和0×7F共33个控制字符。
扩展ASCII:
欧洲国家根据自己语言的特点,将ASCII中的最高位也加入编码,增加欧洲一些出英文字符外特有的字符。扩展后共256中字符,其中前127个不变。
Unicode(UCS) :
默认的Unicode编码采用LittleEndian低位存储,通常又两个字节表示一个字符,256*256=65536个字符。
由于亚洲等国家的字符用一个byte不能完全表示,只能用多个字符表示,所以制定了Unicode编码。
UCS:Unicode Character set,通常Unicode表示UCS的缩写。
BigEndianUnicode:
与Unicode存储顺序相反。
UTF-8/UTF-16/UTF-32:
由于Unicode不能覆盖全部历史上的文字,也不能解决传输的问题 (implantation head-ache’s),尤其在那些基于网络的应用中,因此,Unicode用一些基本的保留字符制定了三套编码方式。它们分别是UTF-8,UTF-16和UTF-32。正如名字所示,在 UTF-8中,字符是以8位序列来编码的,用一个或几个字节来表示一个字符。这种方式的最大好处,是UTF-8保留了ASCII字符的编码做为它的一部 分,例如,在UTF-8和ASCII中,“A”的编码都是0×41.
UTF-16和UTF-32分别是Unicode的16位和32位编码方式。考虑到最初的目的,通常说的Unicode就是指UTF-16。在讨论Unicode时,搞清楚哪种编码方式非常重要。
GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:

GBK、GB2312--Unicode--UTF8

UTF8--Unicode--GBK、GB2312
GBK/GB2312/GB18030:

GB2312:是基于区位码设计的,区位码把编码表分为94个区,每个区对应94个位,每 个字符的区号和位号组合起来就是该汉字的区位码。区位码一般用10进制数来表示,如1601就表示16区1位,对应的字符是“啊”。在区位码的区号和位号 上分别加上0xA0就得到了GB2312编码。区位码中01-09区是符号、数字区,16-87区是汉字区,10-15和88-94是未定义的空白区。它将收录的汉字分成两级:第一级是常用汉字 计 3755个,置于16-55区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计3008个,置于56-87区,按部首/笔画顺序排列。一级汉字 是按照拼音排序的,这个就可以得到某个拼音在一级汉字区位中的范围,很多根据汉字可以得到拼音的程序就是根据这个原理编写的。
GB2312字符集中除常用简体汉字字符外还包括希腊字母、日文平假名及片假名字母、俄语西里尔字母等字符,未收录繁体中文汉字和一些生僻字。可以 用繁体汉字测试某些系统是不是只支持GB2312编码。GB2312的编码范围是0xA1A1-0×7E7E,去掉未定义的区域之后可以理解为实际编码范围是0xA1A1-0xF7FE。
EUC-CN可以理解为GB2312的别名,和GB2312完全相同。
区位码更应该认为是字符集的定义,定义了所收录的字符和字符位置,而GB2312及EUC-CN是实际计算机环境中支持这种字符集的编码。HZ和 ISO- 2022-CN是对应区位码字符集的另外两种编码,都是用7位编码空间来支持汉字。区位码和GB2312编码的关系有点像 Unicode和UTF-8。

GBK编码:是GB2312编码的超集,向下完全兼容GB2312,同时GBK收录了Unicode基本多文种平面中的所有CJK汉字。同 GB2312一样,GBK也支持希腊字母、日文假名字母、俄语字母等字符,但不支持韩语中的表音字符(非汉字字符)。GBK还收录了GB2312不包含的 汉字部首符号、竖排标点符号等字符。

GB18030编码向下兼容GBK和GB2312,兼容的含义是不仅字符兼容,而且相同字符的编码也相同。GB18030收录了所有Unicode3.1中的字符,包括中国少数民族字符,GBK不支持的韩文字符等等,也可以说是世界大多民族的文字符号都被收录在内。GBK和GB2312都是双字节等宽编码,如果算上和ASCII兼容所支持的单字节,也可以理解为是单字节和双字节混合的变长编码。GB18030编码是变长编码,有单字节、双字节和四字节三种方式。

posted @ 2011-06-16 21:51  董雨  阅读(1370)  评论(0编辑  收藏  举报