你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
举报
黄家村村长 发表于 2018-6-1 19:10 我要这种思路的 //发送16位的数据
查看全部评分
shanji 发表于 2018-6-1 18:17 float num=3.14; printf("\r\nnum=%f\r\n",num);
电子星辰 发表于 2018-6-1 21:36 你要发送是很简单的,直接float TxBuffer=3.14;printf("%f",TxBuffer);就可以了。倒是接受要复杂些。 ...
不早说,51时这么用的比较多。
//发送float数据
void usart_send_float(float value)
{
float v_float;
unsigned char * char_p;
unsigned char i;
v_float = value;
char_p = (unsigned char *)(&v_float );
for (i=0;i<4;i++)
{
USART_SendData8(USART1, *char_p );
while( USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
}
}
//float是32位的数,但是double却不一定。改个double的
void usart_send_double (double value)
{
double v_double;
unsigned char * char_p;
unsigned char i,num;
v_double = value;
char_p = (unsigned char *)(&v_double );
num = sizeof(double);
for (i=0;i<num ;i++)
{
USART_SendData8(USART1, *char_p );
while( USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
}
}
评分
查看全部评分
printf("\r\nnum=%f\r\n",num);
评分
查看全部评分
我要这种思路的
//发送16位的数据
void usart_send_value(uint16_t value)
{
unsigned char temph;
unsigned char templ;
temph=(value&0xff00)>>8;
templ=value&0x00ff;
USART_SendData8(USART1, temph);
while( USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
USART_SendData8(USART1, templ);
while( USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
}
uart_send_chars(uint8_*value, uint16_t length);
float tempf;
uart_send_chars((uint8_t *)&tempf, sizeof(float));
如果发给其他的单片机或计算机,就要确定一下浮点表示的标准是不是一样的,如果是一样的也可以这样发
评分
查看全部评分
评分
查看全部评分
发送:
float data = 1.2f;
uint8_t buf[10];
memcpy(buf, &data, sizeof(float));
serial_write(buf, sizeof(float));
接收:
uint8_t buf[10];
float data;
serial_receive(buf, sizeof(float));
memcpy(&data, buf, sizeof(float));
评分
查看全部评分
评分
查看全部评分
评分
查看全部评分
串口发送,直接把float数据的四个字节送出去就行了 。介绍两个最简单经济的做法,思想类似,效率也很高。
当然前提是假设您的USART1设置工作已经做好了。=========================================================================
1.联合体
这种方式比较容易理解,就是让不同的变量在内存中具有重叠,然后分别读取。
2.强制类型转换
就是将float类型强制理解为四个字节的字节流,这种方式简单粗暴,也是我比较喜欢的。
截图看一下,两者效果差不多。
79 E9 F6 42 就是按IEEE754表示的浮点数123.456,不过,需要说明的是,顺序与特定机器(CPU)有关。例如,用我写的程序测试:
网站:http://www.binaryconvert.com/res ... 9050051046052053054显示的结果如下:
从这里可以看出,STM32是Little-Endian的。
反正用这两种搞法,别说一个小小的float类型,就是复杂的自定义类型,都能给你化整为零发出去,然后在接收端按约定好的字节流顺序,一个memcpy又能在接收端满血满魔复活。
串口接收float,这里有个可供参考:https://www.stmcu.org.cn/module/foru ... ewthread&tid=615818
评分
查看全部评分