串口发送接收浮点型数据
2014-05-13 18:03
423 查看
最近正在调试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)发送端
将float data数据拆分成uchar后存储在数组send_frame[]发送。
(2)接收端
将uchar *data首地址付给float_data来合并成float型数据(记得字对齐和大小端存储,不然数据不对)
其实发整数等大于1字节的数据也一样。
上位机 <-> 串口 <-> 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字节的数据也一样。
相关文章推荐
- 串口发送浮点型数据及int(2个字节)long int(4个字节)的方法
- C# UDP、串口的数据接收与发送
- 安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制
- STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085和串口只发送数据不能接收数据问题
- 异步串口模式发送和接收数据
- 关于php串口接收和发送数据的几点技巧
- 求android 中串口的发送接收数据代码
- C#----串口数据接收发送
- MFC单文档之串口通讯实现16进制数据的发送和接收
- 串口类的DateReceived事件---发送一次指令,就会自动触发此事件接收数据
- WPF内实现与串口发送数据和接收数据
- usart 串口的发送-接收数据(正点改编)
- 多串口数据接收和发送
- c# 串口发送接收数据
- C#通讯编程入门--串口数据接收发送实例
- Qt中串口16进制发送和接收数据
- [CC2530]串口接收发送数据
- C#多线程操作WPF GUI控件,串口数据接收发送
- s3c6410 s3c2440串口发送接收数据的实现(轮询)及相关寄存器
- OSAL串口接收发送数据流程简介