PC机将一个千位数(如5142)发送到单片机中,怎么在单片机里将他还原成原来的千位数。或者别的整体办法?
PC机里将一个千位数(如5142)字符串式直接发送到STC单片机中了。在单片机中,采用数组的方式接收成功。如temp[10]。但是我怎么在单片机里将他还原成原来的千位数。...
PC机里将一个千位数(如5142)字符串式直接发送到STC单片机中了。在单片机中,采用数组的方式接收成功。如temp[10]。但是我怎么在单片机里将他还原成原来的千位数。
以下是中断接收的程序。
unsigned int tmp,TurnH; unsigned char temp[];
...之前一个判断了同步成功,sny=1,
if(sny)// 同步成功,存放数据
{
temp[i]=b;
//Send_char(temp[i]);
i++;
if(i==6)
{
if(temp[0]=='M')//分离数据 {
TurnH=temp[4]-0x30;
tmp=temp[3]-0x30;tmp*=10;
TurnH+=tmp;
tmp=temp[2]-0x30;tmp*=100;
TurnH+=tmp;
tmp=(temp[1]-0x30);tmp*=1000;
// Send_char(tmp);
TurnH+=tmp;
//Send_char(temp[1]);Send_char(temp[4]);
//Send_char('9');
send_string(temp,5); //返回确认
Send_char('.'); //结束符号
sny=0;
}
前三个数正常,但是到tmp=(temp[1]-0x30);tmp*=1000;就出错了,tmp返回零。
我发送的时候是直接5、1、4、2一个数字一帧的发送啊,然后单片机收就:temp[0]=5、temp[1]=1、temp[2]=4、temp[3]=2。
我上边的办法可以显示百位,能显示142,但是把高位放大1000倍,再与142相加就出错了。
zyw19987:最高位是千位啊,乘以1000就是等不到结果咯。
coolxgz:你理解错我的意思了
ATF144X:还别说,我就学了点皮毛,而且学的是汇编的,后面KEIL C 完全是自学的。而且我最烦就是各进制转换,你说的5142就是0x1524,我还是理解不了。( ⊙ _ ⊙ )!
自我补充下:
“做而论道”和“ ATF144X”两位高人的说法都可以达到目的。
一步步*10可以,一步到位乘以1000却不可以,也可能是keil C的编译方法问题。
而其中“ ATF144X”的16进制说法我试过,却做不了,但是那表达式却是可以正常转换的,之前我也用过这表达式,不过当时是忘记减0x30。
tony_sgt说的强制转换,我之前就试过了。没用。不过很感谢tony_sgt热心帮助。 展开
以下是中断接收的程序。
unsigned int tmp,TurnH; unsigned char temp[];
...之前一个判断了同步成功,sny=1,
if(sny)// 同步成功,存放数据
{
temp[i]=b;
//Send_char(temp[i]);
i++;
if(i==6)
{
if(temp[0]=='M')//分离数据 {
TurnH=temp[4]-0x30;
tmp=temp[3]-0x30;tmp*=10;
TurnH+=tmp;
tmp=temp[2]-0x30;tmp*=100;
TurnH+=tmp;
tmp=(temp[1]-0x30);tmp*=1000;
// Send_char(tmp);
TurnH+=tmp;
//Send_char(temp[1]);Send_char(temp[4]);
//Send_char('9');
send_string(temp,5); //返回确认
Send_char('.'); //结束符号
sny=0;
}
前三个数正常,但是到tmp=(temp[1]-0x30);tmp*=1000;就出错了,tmp返回零。
我发送的时候是直接5、1、4、2一个数字一帧的发送啊,然后单片机收就:temp[0]=5、temp[1]=1、temp[2]=4、temp[3]=2。
我上边的办法可以显示百位,能显示142,但是把高位放大1000倍,再与142相加就出错了。
zyw19987:最高位是千位啊,乘以1000就是等不到结果咯。
coolxgz:你理解错我的意思了
ATF144X:还别说,我就学了点皮毛,而且学的是汇编的,后面KEIL C 完全是自学的。而且我最烦就是各进制转换,你说的5142就是0x1524,我还是理解不了。( ⊙ _ ⊙ )!
自我补充下:
“做而论道”和“ ATF144X”两位高人的说法都可以达到目的。
一步步*10可以,一步到位乘以1000却不可以,也可能是keil C的编译方法问题。
而其中“ ATF144X”的16进制说法我试过,却做不了,但是那表达式却是可以正常转换的,之前我也用过这表达式,不过当时是忘记减0x30。
tony_sgt说的强制转换,我之前就试过了。没用。不过很感谢tony_sgt热心帮助。 展开
6个回答
展开全部
5142就是0x1416,你将这个数拆成高低字节发送给单片机,单片机再组合成整型数,比你发送5、1、4、2然后又组合的简单多了吧?真不知你是怎么学的。
如果你还是想那样,那程序该这样:
DAT=(tmp[0]-0x30)*1000+(tmp[1]-0x30)*100+(tmp[2]-0x30)*10+(tmp[3]-0x30)
补充:那还真的要多学习啊!在单片机里最好是用二进制和16进制来思考问题,10进制5142转换为16进制就是0x1416(前面我搞错了,不好意思),你可以用计算器检验一下。
如果你还是想那样,那程序该这样:
DAT=(tmp[0]-0x30)*1000+(tmp[1]-0x30)*100+(tmp[2]-0x30)*10+(tmp[3]-0x30)
补充:那还真的要多学习啊!在单片机里最好是用二进制和16进制来思考问题,10进制5142转换为16进制就是0x1416(前面我搞错了,不好意思),你可以用计算器检验一下。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
if(temp[0]=='M')//分离数据 {
TurnH = 0;
TurnH += temp[1] - 0x30;
TurnH *= 10;
TurnH += temp[2] - 0x30;
TurnH *= 10;
TurnH += temp[3] - 0x30;
TurnH *= 10;
TurnH += temp[4] - 0x30;
// Send_char(tmp);
TurnH = 0;
TurnH += temp[1] - 0x30;
TurnH *= 10;
TurnH += temp[2] - 0x30;
TurnH *= 10;
TurnH += temp[3] - 0x30;
TurnH *= 10;
TurnH += temp[4] - 0x30;
// Send_char(tmp);
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这是不可能的
单片机最多64位 你的5000多位只能作为向量存储
我是北大通信的
这个十分确定
单片机最多64位 你的5000多位只能作为向量存储
我是北大通信的
这个十分确定
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
发过来的时候就按一定规律来发,比如从高到低,或者从低到高,高位数据乘上10加上相邻的低位直到加上最低位为止。不知道是不是你问的问题
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这应该是两个变量型态不同而导致的问题,在你计算TEMP的数值的时候应该这样
temp=(unsigned int) temp[1]*1000;以强制转换你的unsigned char类型的temp数组到unsigned int以符合temp的类型..此类推到你所有数组计算完成
temp=(unsigned int) temp[1]*1000;以强制转换你的unsigned char类型的temp数组到unsigned int以符合temp的类型..此类推到你所有数组计算完成
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询