linux下,板子通过串口连接发送中文短信,关于串口设置,及发送英文短信很简单就不说了,先说说如何做,及遇到的问题。

  linux下,在VIM(一定在vim中保存中文,这个问题下面再提)保存中文内容,通过iconv函数从当然语言编码转为GPRS的UCS2的编码。

int encode (char * message)

 int src_len,dest_len=MAXSIZE;
 iconv_t cd;
 char buffer[MAXSIZE];
  //char buffer[MAXSIZE]="有贼来***了";
 strcpy(buffer,message);
 char dest[MAXSIZE];
 char * pin=buffer;
 char * pout=dest;
 src_len=strlen(buffer);

 if((cd =iconv_open("UNICODEBIG","utf8"))== (iconv_t)-1)
 {
  perror("cann't open iconv_open function/n");
  exit(-1);
 }

 if(iconv(cd, &pin,&src_len,
   &pout,&dest_len) == (size_t)-1)
 {
  perror("cann't open iconv function/n");
  exit(-1);
 }
 iconv_close(cd);
 
 strcpy(message,dest);
 return strlen(dest);
}

需要注意的就是iconv_open的二个参数,以前看到参数如GB2312 GB-ZN,参数传进去都是错误,我用的ubuntu,所以参数是utf8,虽然GPRS用的UCS2的编码,转化的时候用unicodebig编码的方式,发送中文短信接收的时候,都能正常的显示。

还有个问题是存储中文的内容一定要用VIM保存,并且不能再用GEDIT打开 或者你把源文件拷到windows下添加几行注释,再拷回编译照样编码转化时出错。虽然gedit上设置为utf8编码,这样问题依然存在。

 

另外一个问题说,中英文短信混编的问题。linux下保存中文,一个中文字符,按unicode应该是二个字节,但是vim保存中文的时候,很少有情况是二个字节,大部分情况是三个字节。保存英文字符那是很固定,都是一个字节。中英文混编的问题出来了,vim可以自动识别中英文,并且按三字节和一个字节保存,并且都不知道如何区分中英文(如果英文恰好作为中文的第一个字节,如何区分,是作为英文还是作为中文的第一个字节)。中英文短信混遍的问题,接受的手机显示的时候,从字符开始以后都是乱码。

另外需要注意的就是,GPRS发送AT指令以/r结束,GPRS回的时候大部分以/n/t开始和结束。短信内容以/x1a(ctrl+Z)结束。还有个需要注意的是,有的时候每个字节要格式化成二位的十六进制输出。