OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4095|回复: 3

还有人用C51的软件吗?串口发送中文字“数”每次都只上送0xCA单个数据,其他中文字都是2个,这都是什么鬼啊

[复制链接]

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3337
金钱
3337
注册时间
2013-5-28
在线时间
467 小时
发表于 2016-6-23 09:00:03 | 显示全部楼层 |阅读模式
5金钱
还有人用C51的软件吗?串口发送中文字“数”每次都只上送0xCA单个数据,其他中文字都是2个,这都是什么鬼啊
看我发送的数据
222222222.png
看我收到的数据
111111.png

仿真过了,硬件没少发数字,算法也没少发,因为在软件仿真中,到数这个中文时,送上来的就是一组数据0xCA,其他种种文字都是2个编码,而31,32是1跟2的十六进制ASCII编码,填了个1或2正好补齐他,不然只有第一个你是对的,其他全部乱码


谁遇到过?

最佳答案

查看完整内容[请看2#楼]

Keil C51汉字显示的bug问题(0xFD问题)   一、缘起   这两天改进MCU的液晶显示方法,采用“即编即显”的思路,编写了一个可以直接显示字符串的程序。如程序调用disstr("我是你老爸");液晶屏上就会显示“我是你老爸”。   二、问题   但是,花了1天多时间辛辛苦苦改好的程序后,却发现有些汉字显示有问题。比如: P1:在第一行显示“实时参数”,第二行显示“工作状态”,实际上“工作状态”却重复显示了,除了在正确 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3337
金钱
3337
注册时间
2013-5-28
在线时间
467 小时
 楼主| 发表于 2016-6-23 09:00:04 | 显示全部楼层
Keil C51汉字显示的bug问题(0xFD问题)
  一、缘起
  这两天改进MCU的液晶显示方法,采用“即编即显”的思路,编写了一个可以直接显示字符串的程序。如程序调用disstr("我是你老爸");液晶屏上就会显示“我是你老爸”。

  二、问题
  但是,花了1天多时间辛辛苦苦改好的程序后,却发现有些汉字显示有问题。比如:
P1:在第一行显示“实时参数”,第二行显示“工作状态”,实际上“工作状态”却重复显示了,除了在正确的地方显示外,还在“实时参数”后显示了。
P2:"正"字后若有":",则都显示成乱码。如果后面没有":",则"正"字可正确显示,但是后面却显示了后面的一行字。
P3:"过"字总显示乱码;

  三、求索
  通过调试发现,上述汉字显示不正常的时候,是因为在字库中找不到匹配的汉字。可是,自建的字库中明明有这些汉字,而且"数","正"字在后面无字符的时候是显示正确的啊!问题找了好久,怀疑传参类型不对,汉字查找可能溢出等,反复修改,总是无法解决问题,而且从现象来思考,都不应该是这些问题。今日灵光一现:为什么不在传递字符串后显示该字符串的变量值呢?
  经过详细研究,西文字符在传递时应该是ACSII值,一个字节,数值小于128;而汉字传递的是其机内码,分高低2个字节,2个字节都大于127,当然并小于256。字符串传递参数值一显示,可不得了。其惊人之处有:
1."数","正","过"正确显示时其传参值为:0xca00,0xd500,0xb900;而其正确的机内码应该是:0xcafd,0xd5fd,0xb9fd。看来其低位字节被无情忽视。
2."数","正","过"单独显示正确,但是后面带一个字符或汉字就显示乱码了。如"正:"传参的值为:0xd53a,0x0000;"数"传参的值为:0xca20,0x0000。而":"和" "的ASCII值恰好是0x3a,0x20,看来这几个汉字是叛变到西文字符中去了,机内码只有一个高位字节了。
3.将传参值直接赋给汉字显示函数,如"过"用"0xb9,0xfd"是显示不了的,只能用"0xb9,0x00"。
4.比较发现,显示不正常的"数","正","过"三个字的低位字节都是0xfd,而一直显示正确的"一二"等汉字机内码的低位字节都不是0xfd。
  莫非keil跟0xfd有不共戴天之仇?

  四、解决
  用"keil c51的汉字显示问题"一搜就找到组织了,泪奔啊。组织的力量大,很快就给出了让我这等底层开发者劳累辛苦的原因:这是万恶的keil存在的一个臭名昭著的bug!伟大的组织同时无私的提供了答案,而且还不止一种哦。以下是从某同志的blog中摘录:
  解决方法两个:
①下个晓奇工作室出的补丁,自己搜一下。(http://www.xiao-qi.com/mcu/
②用十六进制编辑软件如HexEdit打开c51.exe,搜索80FBFD,改为80FBFF即可。
c51.exe位置:Keil安装目录/keil/c51/bin/c51.exe”
赶紧拿起前辈们提供的武器,向keil 0xfd bug发起猛烈冲锋!……
待我重新烧录好程序,轻轻的打开电源,液晶屏幕上的一个个汉字显示得整齐而又干净,整个世界清静了…………



提示:如果上面显示空白或者页面排版混乱、内容显示不完整等影响阅读的问题,请点击这儿浏览原文

返回脚本百事通首页    如果您喜欢IT行业或者对IT行业感兴趣,欢迎加入本站官方QQ群:246889341,在群里认识新朋友和交流技术^_^
5
该内容对我有帮助
KEIL CRACK及 0xFD Bug修正方法







0xFD Bug是keil编译器中始终存在,而又从未得到官方修复的一个BUG!!!

BUG描述:当C源代码中使用了汉字等非ASCII字符,而此字符的编码又恰好包含了大于或等于0xFD的字节时,这个字节将被编译器删除,从而最终程序代码的运行错误。


BUG修复方法一:
用十六进制编辑软件打开c51.exe和cx51.exe(这两个文件是相同的,名字不同)
c51.exe位置: Keil安装目录/keil/c51/bin/c51.exe
cx51.exe位置:Keil安装目录/keil/c51/bin/cx51.exe

v905之前的0xfd漏洞修正方法:

查找    80fbfd56
替换为 80fbff56
v905的0xfd漏洞修正方法
查找    80fbfd0f
替换为 80fbff0f


BUG修复方法二:
拷贝本目录下的Keil_C51_0xFD_fix.exe至Keil安装目录/keil/c51/bin/下运行即可。

















提示:如果上面显示空白或者页面排版混乱、内容显示不完整等影响阅读的问题,请点击这儿浏览原文

返回脚本百事通首页    如果您喜欢IT行业或者对IT行业感兴趣,欢迎加入本站官方QQ群:246889341,在群里认识新朋友和交流技术^_^
5
该内容对我有帮助
Keil UV4 BUG(带字库液晶不能显示“数、正、过”问题的请看)
  Keil UV3一直存在汉字显示(0xFD)的bug,以前在用到带字库的12864液晶的时候,“数”字总是不能正常显示,后来有网友告诉我这是keil的bug,解决掉了。后来keil升级了,我也换了新版本Keil UV4,把Keil UV3存在汉字显示bug的这个问题给忘记了,最近又用到12864液晶,发现Keil UV4编译出来的程序还是不能正常显示“数”字,又去查了一遍液晶说明书里的字库,发现里面有“数”字,突然想起来Keil UV3的bug,然后照以前的办法修改了Keil UV4的bug,现在显示正常了。
  在这里给大家提个醒,Keil升级成UV4了,但是UV3的bug却遗留着,有用到带字库的液晶,赶紧去把这个问题解决掉!
  解决办法:用十六进制编辑软件HexEdit打开Keil安装目录/keil/c51/bin/c51.exe,搜索80FBFD,改为80FBFF即可。

  编译器没有修改之前不能正常显示

  修改了bug显示正常了

“三”的机内码是C8FD,“数”的机内码是CAFD,“过”的机内码是B9FD,我试过了,只要是机内码后两位是FD的都不能显示,修改了bug就可以了。
没有修改bug三不能显示 (原文件名:图片_0~1.JPG)


修改了bug显示正常了 (原文件名:图片_0~1.JPG)
在此我也把ST7920的说明书上传,可以查看一下汉字机内码表st7920中文数据手册.pdfourdev_671134YUMHPO.pdf(文件大小:1.64M)





这个问题早就遇到过。是编译器的问题。
点击此处下载 ourdev_673840SD8X3K.rar(文件大小:10K) (原文件名:ccKeilVxx.rar)

将文件解压后放入keil/c51/bin文件夹运行即可。



keil 不认为是bug

http://www.keil.com/support/docs/2618.htm

我现在已经不打补丁了,免得出个新版本不支持,写的时候避免吧



用内码代替,即例如
printf ("Hello World \xca\xfd \n"); /* Print "Hello World 数" */





下面的是来自Keil官方的解决方法

http://www.keil.com/support/docs/2618.htm

GENERAL: COMPILER IGNORES 0XFD, 0XFE, 0XFF VALUES IN STRINGS

Information in this article applies to:

    * C166 Compiler All Versions
    * Cx51 Compiler All Versions
    * C251 Compiler All Versions

QUESTION

I have a problem with the interpretation of Russian strings in the Keil C51 compiler. Some Russian characters are using the encoding 0xFD. It looks like this encoding is ignored by the compiler and is not included in the program code.

Example:

code char RussianString[] = "??? ????";

Why does this problem exist and how can I avoid this behavior?
ANSWER

The character encodings 0xFD, 0xFE, and 0xFF are used internally by the C compiler. The ANSI standard only requires support for ASCII characters in the range 0x00 - 0x7F.

You may insert these characters by using HEX encodings in the string as follows:

code char RussianString[] = "My Text" "\xFD";

A simple text replacement which replaces all 0xFD characters with the string '" "\xFD' should do the job.





对于这个BUG建议还是不要修改软件,因为不确定在某些特定条件下是否会引起莫名奇妙的其他问题,而且涉及到这个BUG的汉字不多,下面是从GB2312中抽了出来:

褒 饼 昌 除 待 谍 洱 俘 庚 过

糊 积 箭 烬 君 魁 例 笼 慢 谬

凝 琵 讫 驱 三 升 数 她 听 妄

锡 淆 旋 妖 引 育 札 正 铸

佚 冽 邶 埤 荦 蔟 摭 啐 帻 猃

恺 泯 潺 妪 纨 琮 椠 辇 挲 臊

忑 睚 铨 稞 瘕 颀 螨 簖 酏 觚

鳊 鼾

碰到这些字,建议手动处理一下就好了!
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3337
金钱
3337
注册时间
2013-5-28
在线时间
467 小时
 楼主| 发表于 2016-6-23 09:31:04 | 显示全部楼层
http://www.csdn123.com/html/itweb/20130826/83349_83358_83343.htm
问题解决,担心页面失效或删除,我去把整片拷贝过来
回复

使用道具 举报

2

主题

171

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3792
金钱
3792
注册时间
2016-6-26
在线时间
276 小时
发表于 2016-6-26 13:31:54 | 显示全部楼层
一直有这个BUG.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 17:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表