今天突然用到了用单片机和上位机进行传递浮点数方法是这样的。
1.将浮点数转化为整数,然后传递整数的ascII码形式。
2.进行编码,这个暂时我是这样理解的,比方说a=7.345678这样的浮点数。
可以进行编码 成一个帧数据 帧头 +数据位+ 整数编码+加小数点+小数编码
具体的解码方法是:a/1取整,得到整数7,然后再添加一个小数点编码!(如0x55),然后再用a-7得到小数部分,然后将小数扩大10倍。再取整然后继续进行取整,以此类推将
小数都编码成功。然后发送过去就可以了。
3.第三种方法也是利用内存,不用知到浮点数的具体编码方式,因为在单片机中浮点数占4个字节,就知道这一点就可以了,我们可以采用联合体的方式,
float value=-17.484;
union //联合体定义
{
u8 a[4];
float b;
}temp;
void Change_to_byte(void)
{
temp.b = value; //将数据存入联合休中
array[0] = temp.a[0]; //一个字节一个字节的取出来
array[1] = temp.a[1];
array[2] = temp.a[2];
array[3] = temp.a[3];
}
再用串口把array[0...4]发送出去就可以了,大功告成。
4.收到这种方法的启发,当然我们也可以使用指针来做。
float value=-9.4567;
float *p=&value;
unsigned char *q;
/*******************************************************************************
* 函数名 : main
* 函数描述 : 主函数
* 输入参数 : 无
* 输出结果 : 无
* 返回值 : 无
*******************************************************************************/
int main(void)
{
int j;
/*设置系统时钟 */
RCC_Configuration();
/* 设置GPIO端口 */
GPIO_Configuration();
/* 设置 USART */
USART_Configuration();
q=(unsigned char *)p;
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) != SET);
for(j=0;j<4;j++)//发送四个字节,表示一个浮点数
{
USART_SendData(USART1,q[j]);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) != SET);
}