串口发送接收浮点型数据

最近正在调试nrf24L01无线通行模块,由于要fpga与PC机相互通信,PC机没spi,所以要个开发板转发,数据传输流程如下:

上位机 <-> 串口 <-> ARM开发板 <-> spi<->nrf24L01<->另一个nrf24L01<->spi<->fpga开发板。

其中遇到一个头疼的问题是传输的都是浮点型数,但发送接受的是unsigned char型。

float,占4字节,包括符号位(1位,第31位),指数为(8位,-126~128,22~30位),尾数位(23位,0~22位)


当时想出了两种方案

(1)其实精度要求不高的话,直接把浮点数X100转化成16位或32位整数,在拆分为unsigned char类型发过去,在接收后合并,并强制转化为float在除以100.(不太好放弃)

(2)直接把float数据拆分为4个unsigned char,发过去,在合并为float。

我使用方案(2),其中有两点要注意。

(1)大端存储,小段存储;如果搞错读取数据就不是你接收的数据地址(我主要使用了fpga,arm以及PC机,很有可能存储方式不同,一般可能不需要考虑)

 (2)字对齐。不然就合并不成float(我先前没注意直接一个很怪异的数据)


方法如下:

(1)发送端

void package_frame(const void *data)
{
	int i;
	for(i=0; i<4; i++)
	{
		send_frame[i] = ((uchar *)data)[i];
	}
}

将float data 数据拆分成uchar后存储在数组 send_frame[] 发送。

(2)接收端

float exchange_data(uchar *data)
{

	float float_data;
	float_data = *((float*)data);
	return float_data;
}

将uchar *data首地址付给float_data来合并成float型数据(记得字对齐和大小端存储,不然数据不对)

其实发整数等大于1字节的数据也一样。


你可能感兴趣的:(串口发送接收浮点型数据)