前言
本篇文章主要是通过无线模块让两个STM32之间收发float数据。
方法
在阅读其他相关文章的时候,了解到主要有两种方法
第一个是利用指针将float数据拆分为四个字节在套个for循环依次发出去。
第二个是利用 联合体(union)一个类似于结构体的声明,可以让不同类型的数据共用内存。
利用指针拆分
发送端:
利用指针将float数据拆分成为4个字节逐个发送。
void Usart_SendFloat(USART_TypeDef *USARTx , float data)
{
float v_float ;
unsigned char * char_p = NULL;
v_float = data;
char_p = (unsigned char *)(&v_float );
for ( unsigned char i = 0;i < sizeof(float);i++)
{
USART_SendData(USARTx, *(char_p+i));
while( USART_GetFlagStatus(USARTx,USART_FLAG_TXE) == RESET);
}
}
接收端
char Receive_Buff [100] = {0}; //利用数组来接受四个字节
unsigned char buf_cnt = 0;
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
{
if(buf_cnt >= sizeof(float)) buf_cnt = 0; //只接受四个字节数据
Receive_Buff [buf_cnt++] = USART_ReceiveData(USART1);
USART_ClearFlag(USART1, USART_FLAG_RXNE);
}
}
char RX_Buf[4];
int main (void)
{
while(1)
{
for (unsigned char i = 0; i < sizeof(float); i++)
{
RX_Buf[i] = Receive_Buff[i]; //接收来自串口的数据
}
Float_Data = *(float *)(RX_Buf);//转换为float数据
memset(RX_Buf,0,sizeof(RX_Buf)); //清除缓存数据
Delay_ms(1000);
}
return 0;
}
联合体(union)
对于两块STM32之间通讯来说联合体并不适用
总结
发送int类型的数据也可以这样操作。
若是要发送多个数据,可以创建一个数据包,在利用包头包尾做判断的方式来使一个数据包能完整的被接受方接收。