yue621 发表于 2013-3-28 23:03:59

关于C2000发送float型数据的求教~~急!急!急!

关于C2000发送float型数据的求教~~急!急!急!

各位坛友,最近我在看怎么用C2000发送float型数据,想实现的功能是这样的:

上位机(串口助手)以unsigned char 的形式发四个数据,C2000接收到,
并存入数组中,然后转换回float,再发送到上位机。

关于如何转换,搜索了不少资料,发现最好的方法应该是直接用IEEE745的标准:

将float转换成char:
void FloatToByte(float floatNum,unsigned char* byteArry)
{
   char* pchar=(char*)&floatNum;
   for(int i=0;i<sizeof(float);i++)
   {
      *byteArry=*pchar;
      pchar++;
      byteArry++;
   }
}

将unsigned char转换成float:
float ByteToFloat(unsigned char* byteArry)
{
   return *((float*)byteArry);
}

这两个函数都是网上的高人写的,应该没有问题。但是我在用launch pad调试的时候,遇到了很奇怪的问题:

如果我先给出一个数,例如12.12,先用floattobyte 函数转换成 uchar,
再用bytetofloat 将保存有uchar 的数组转换回 float,最后发送这个float,结果是对的;

但是,如果我先设置一个数组,uchar【4】,将从上位机接收到的数据存入这个数组,
再用bytetofloat函数转成float,则不论我怎么发,发什么数据,始终显示的是+0.000.

非常郁闷啊!这是为什么呢?可能的原因是C2000的uchar格式是16位吗?还是这个函数我用错了?急求指点!
谢谢大家!!!!另外在坛子里貌似还没看见有人问这类问题,希望大家能多多指点~~
真是调的郁闷啊!!!!!!!求救啊!!!!!!!!!!!!!!!!!!!!1

yue621 发表于 2013-3-28 23:04:39

忘了悬赏了,不过大家解答的好我一定会给莫元的,谢谢大家!{:lol:}

lyl2022 发表于 2013-3-28 23:21:04

接收上位机数据时正常的吗?还是发送给上位机的数据有问题?这个能判定吗

yue621 发表于 2013-3-28 23:37:53

lyl2022 发表于 2013-3-28 23:21 static/image/common/back.gif
接收上位机数据时正常的吗?还是发送给上位机的数据有问题?这个能判定吗 ...

正常的,我试过先接收,再发送出来上位机的数据,证实是对的。
发送如果按uchar来发,也是对的,问题就是,在C2000里合成一个float发,
就会一直是0.0000,晕啊

lyl2022 发表于 2013-3-28 23:42:10

应该是合成FLOAT的时候出的问题吧,合成的时候用的上面的程序?

yue621 发表于 2013-3-28 23:46:49

lyl2022 发表于 2013-3-28 23:42 static/image/common/back.gif
应该是合成FLOAT的时候出的问题吧,合成的时候用的上面的程序?

对,而且最奇怪的是如果我在程序内部先调用floattobyte,将一个float转换成四个uchar,再调用这个bytetofloat转成
float 的话,是对的
但是先接收再存进去再转换,就错了。纠结啊。
谢谢你啦!

lyl2022 发表于 2013-3-28 23:47:23

合成的float能用仿真器看吗?LZ 买的哪家板子啊

yue621 发表于 2013-3-28 23:52:16

TI 官方的launchpadC2000。。。。。这个还真没仔细看,回头我看看~~~谢谢啦!很晚了,晚安,明天再看了{:lol:}

monkerman 发表于 2013-3-31 16:55:59

用联合转换发送. 注意大小端和收发次序.
char不可能是16位的. C语言标准规定.

yue621 发表于 2013-3-31 20:06:52

monkerman 发表于 2013-3-31 16:55 static/image/common/back.gif
用联合转换发送. 注意大小端和收发次序.
char不可能是16位的. C语言标准规定.
...

问题是,DSP的char规定好像确实是16位啊。。。。联合发送是什么啊?可以帮忙贴一下程序吗?谢谢你啦!!{:lol:}

chenchaoting 发表于 2013-3-31 20:44:04

用联合就可以了,不用转换

yue621 发表于 2013-3-31 21:32:52

chenchaoting 发表于 2013-3-31 20:44 static/image/common/back.gif
用联合就可以了,不用转换

大哥。。。你说的是设置一个union共同体么。。。。求贴程序啊。。。。

chenchaoting 发表于 2013-3-31 22:48:02

程序现在没有,你看,FLOAT型是占用4个字节,CHAR是一个字节,你发送四个字节,在处理器中将这四个当一个FLOAT读就行了,什么都不用管,注意地址的大小端,你最好看看数据是怎么存的,对,就是UNION

yue621 发表于 2013-3-31 23:15:52

chenchaoting 发表于 2013-3-31 22:48 static/image/common/back.gif
程序现在没有,你看,FLOAT型是占用4个字节,CHAR是一个字节,你发送四个字节,在处理器中将这四个当一个FL ...

恩,好的。我试试,谢谢啦!

monkerman 发表于 2013-4-1 08:37:54

yue621 发表于 2013-3-31 20:06 static/image/common/back.gif
问题是,DSP的char规定好像确实是16位啊。。。。联合发送是什么啊?可以帮忙贴一下程序吗?谢谢你啦!!{ ...

哎哟我去哟...........看了下手册. 尼玛真是 16bits. 抱歉是我错了. 他说支持 ISO和ANSI-C标准.......好吧. 标准也没说 char 就是 8 位只说是一个字节. 差点误导你了.
联合的话, 你直接搜一下吧. 很简单. 网上有, 坛子里也有.

yue621 发表于 2013-4-1 10:13:11

monkerman 发表于 2013-4-1 08:37 static/image/common/back.gif
哎哟我去哟...........看了下手册. 尼玛真是 16bits. 抱歉是我错了. 他说支持 ISO和ANSI-C标准.......好 ...

恩,好的,谢谢啦!!!!!!

youpeng 发表于 2013-8-15 00:23:10

这个问题lz解决了没?

steaven2000 发表于 2013-8-15 10:10:20

楼主,使用库函数完成吧:sprintf(buffer, "%2.2f", (float)A);
这个函数把浮点数A转换成格式化的浮点数(你可以定义格式),存放在buffer数组中,以'\n'字符结尾。

u123321 发表于 2013-8-24 13:22:56

类似的问题我也遇到过,就是char是16位的原因
页: [1]
查看完整版本: 关于C2000发送float型数据的求教~~急!急!急!