Microchip
直播中

潘斯凯

7年用户 153经验值
私信 关注
[问答]

十进制到十六进制如何转换

与16F24K22一起工作并读取表示十进制数的字符。然后我试着把它转换成十六进制值…它适用于一些数字而不是其他数字。我找到了模式,但似乎无法锁定它的错误或如何修复。(注意,我的代码很大,所以我不能发布完整的代码)以下是它应该如何工作(简单版本):a='1',b='2'发送a,b到函数返回0x0C//12(十进制)=0x0C(十六进制)更高级:a='0',b='6',c='2',d='9'发送a,b,c,d到函数返回0x0275//629(十进制)=0x0x0275(十六)。有道理吗?这里是我的函数:uint24_t ProcessNMEA(无符号字符a,无符号字符b,无符号字符c,无符号字符c,无符号字符d,无符号字符d,无符号字符e,无符号字符f){uint24_t temp=0x000000;temp=((uint24_t24_t temp temp=0x24ttemp=0x24temp=0x000000000000000000000000000000000000temp;temp=temp=((a-'0-'0') *0x186A0) *0x186A0) +((b-'0') *0x186A0)*0x186A0) +((b-'0') *0000X710)+++((b-') *0X-‘0’)*0x0A)+(f-'0');返回temp;}我用这个调用它:temp24=ProcessNMEA(a,b,c,d,e,f);//其中a-f只是字符'0'-'9'。然后将temp24分成三个8字节的characterstemp1=(temp24&0xff0000UL)>16;//将24位分解为38个bittemp2=(temp24&0x00ff00UL)>gt;8;TEMP3=(TEMP24&0x00 00 FFUL);似乎很直接…所以这里是奇怪的地方…下面是函数的输入及其输出(以三个分隔字节)(a,b,c,d,e,f)->0x00000000000000->00000000Correct000001->0001Correct...000099->0063Correct000100->0064Correct...000999->0003E7Correct00100010001000->0003E8 Correct.....009999->GT;00 27 0F改正010000 - 00;27 10校正…069999和01;11!(应该是01 11 70)…所有错误在此099999->00869F错误(应该是01869F)100000->01869A更正...所有错误在此169999->02980F更正170000->019810错误...所有错误1999年9月9日-0月02日3F错误20 000 -和03 0D 40正确……模式继续。X7000和X999之间的任何东西都会将第十七位从0变为0……欢迎任何想法或建议。如果有一个更好的方式来做这件事,请随时张贴它。我没有结婚的代码,我只是需要它来工作…

回帖(6)

李天竹

2020-4-28 13:07:37
结果的类型是“int”,它是16位。任何不适合的位都会丢失。因此,B& GT;6的一切都会产生错误的结果。
举报

李维兴

2020-4-28 13:23:34
读小数更容易。尝试一下这个方法,希望我获得了正确的数字().UL后缀强制编译器使用32位整数数学以避免溢出。
举报

李维兴

2020-4-28 13:42:12
…或者这可能更有效:
举报

丛聪

2020-4-28 13:56:09
只是一个快速检查,异常(第十七位翻转)出现在TANT24以及TUNM1?您的算法看起来相当合理,因此可能值得检查一下,看看在将值分割时出现的位移位/类型转换中是否发生了问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分