1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我现在要用到GB2312码,不过串口的数据是U码,现在涉及到将U码转化成GB码的问题。 在网上查了一些资料,有的是用查表的方法得到的,而映射表的数组非常庞大(全部可能要128K),51单片机的存储空间有限,请问用什么方法可以扩展? 还有如果我用高通的字库芯片GT21H16S2Y,可以将U码转化成GB码吗?能不能提供下程序? 各位大神是怎么做到的,不胜感激~~~ |
|
相关推荐
22个回答
|
|
本帖最后由 爱我别走 于 2013-7-22 01:34 编辑
方法一,如果你的单片机存储空间够大,你可以用查表发。附件里面有一个gb2uni.h的文件, 可以很方便的在GBK和Unicode码之间相互转换。 方法二,使用字库芯片,如高通GT21L16S2W,***给你,实测可用。通过你的描述, 我推测你应该是在做单片机控制GPRS模块收发短信吧。 /*------------------------------------------- 引脚连接宏定义 ------------------------------------------------*/ ***it GT_CS = P2^0; ***it GT_SO = P2^1; ***it GT_SI = P2^2; ***it GT_CLK = P2^3; /*-------------------------------------------------- 函数名 :ReadByte 功能 :读取任意地址数据 输入参数: 输出参数: --------------------------------------------------- */ unsigned char ReadByte(unsigned long Address) { unsigned char i = 0,j = 0,temp = 0x0B; GT_CS = 0; //发送指令 for(i=0; i<8; i++) { GT_CLK = 0; GT_SI = temp&0x80; temp <<= 1; GT_CLK = 1; } //发送地址 for(j=1; j<4; j++) { temp = ( (unsigned char*)&Address )[j] ; for(i=0; i<8; i++) { GT_CLK = 0; GT_SI =temp & 0x80; temp <<= 1; GT_CLK = 1; } } //发送空字节 for(i=0; i<8; i++) { GT_CLK = 0; GT_SI = 0; GT_CLK = 1; } //接收数据 for(i=0; i<8; i++) { GT_CLK = 0; temp <<= 1; if(GT_SO) temp |= 0x01; else temp &= 0xFE; GT_CLK = 1; } GT_CS = 1; return temp; } /*-------------------------------------------------- 函数名 :UnicodeToGB2312 功能 :Unicode 到GB2312 内码转换程序 输入参数:srcCode Unicode码 输出参数:destCode GB2312码 --------------------------------------------------- */ void UnicodeToGB2312(unsigned char*srcCode,unsigned char*destCode) { unsigned long ptr; unsigned char result=0; unsigned int h; unsigned int Code; Code = *srcCode++; Code = (Code<<8) + *srcCode; if(Code<0xa0) result=1; else if(Code<=0xf7) h=Code-160; else if(Code<0x2c7) result=1; else if(Code<=0x2c9) h=Code-160-463; else if(Code<0x2010) result=1; else if(Code<=0x2312) h=Code-160-463-7494; else if(Code<0x2460) result=1; else if(Code<=0x2642) h=Code-160-463-7494-333; else if(Code<0x3000) result=1; else if(Code<=0x3017) h=Code-160-463-7494-333-2493; else if(Code<0x3220) result=1; else if(Code<=0x3229) h=Code-160-463-7494-333-2493-520; else if(Code<0x4e00) result=1; else if(Code<=0x9b54) h=Code-160-463-7494-333-2493-520-7126; else if(Code<0x9c7c) result=1; else if(Code<=0x9ce2) h=Code-160-463-7494-333-2493-520-7126-295; else if(Code<0x9e1f) result=1; else if(Code<=0x9fa0) h=Code-160-463-7494-333-2493-520-7126-295-316; else if(Code<0xe76c) result=1; else if(Code<=0xe774) h=Code-160-463-7494-333-2493-520-7126-295-316-18379; else if(Code<0xff00) result=1; else if(Code<=0xff5f) h=Code-160-463-7494-333-2493-520-7126-295-316-18379-6027; else if(Code<0xffe0) result=1; else if(Code<=0xffe5) h=Code-160-463-7494-333-2493-520-7126-295-316-18379-6027-128; else result=1; if(result==0) { ptr = 0x67d70 + (h<<1); *destCode++ = ReadByte(ptr++); *destCode = ReadByte(ptr); } else { *destCode++ =*srcCode; *destCode = ' '; } }
最佳答案
|
|
|
|
希望有人来帮忙~~
|
|
|
|
这个真不知道 你自己去查查
|
|
|
|
本帖最后由 def_2 于 2013-7-22 07:02 编辑
非常感谢~~现在还有一些问题,我用了你的后一个代码。 请问是这样调用有错吗? unsigned char xdata GB2312[30]; unsigned char xdata UNICODE[30]; //提取后的汉字U码缓冲区 for(i=0;i<30;i++) { UnicodeToGB2312(UNICODE[i ],GB2312[i ]); } 为什么提示错误 error C214: illegal pointer conversion ?? |
|
|
|
参数要传递指针,所以要这样改下, 修改一, unsigned char xdata GB2312[30]; unsigned char xdata UNICODE[30]; //提取后的汉字U码缓冲区 for(i=0;i<30;i+=2) { UnicodeToGB2312(&UNICODE[i ],&GB2312[i ]); } 修改二, unsigned char xdata GB2312[30]; unsigned char xdata UNICODE[30]; //提取后的汉字U码缓冲区 for(i=0;i<30;i+=2) { UnicodeToGB2312(UNICODE+i,GB2312+i); } |
|
|
|
为什么 i 改成了 i +=2 ?? |
|
|
|
|
|
|
|
那就是说,比如汉字“电子”的UNICODE内码为0x7535,0x5b50,GB2312内码为0xb5e7,0xd7d3在数组中表示应该如下 UNICODE[30] = { 0x75,0x35, //电 0x5b,0x50, //子 } 经过函数转换成功后,得到如下数组,对吗?? GB2312[30] = { 0xb5,0xe7, //电 0xd7,0xd3, //子 } |
|
|
|
对的。 |
|
|
|
如果这样的话,两个汉字的UNICODE有4个字节,对应转换后的GB2312也应该是4个字节哈,那就是要循环 i 次,为什么还加2啊? |
|
|
|
两个汉字,对应四个字节,但只需要循环两次,因为转换函数是以两个字节为单位的。 |
|
|
|
请问您的这个读任意地址数据readbyte函数,是怎么做到读取的呢,GT21这个字库芯片的快速读不应该是先写1字节0b,然后3字节地址,你这不是取得四字节地址的后三字节吗? |
|
|
|
正在做这方面的程序,想问下 方法一 有没有相应的基于查表的转换程序??? |
|
|
|
正在做这方面的程序,想问下方法一 有没有相应的基于查表的转换程序? |
|
|
|
good gan jue bu cuo de yang zi
|
|
|
|
你好,我也在做单片机控制GSM模块收发短信的项目,你的问题解决了吗?怎么用查表的方式把unicode码转换成GBK的? |
|
|
|
正在做这方面的程序
|
|
|
|
查表法怎么做???同求。。。谢谢!!
|
|
|
|
谢谢!正在做这方面的东西
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
195 浏览 0 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
172 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
453 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
697 浏览 2 评论
602 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11983 浏览 31 评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 05:51 , Processed in 0.978995 second(s), Total 111, Slave 92 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号