以此文章,记录本人stm32的学习之路...
声明:以下方法适合初学者,大佬请划走 (/ω\)
1、串口发送/接收函数
- HAL_UART_Transmit();串口发送数据,使用超时管理机制
- HAL_UART_Receive();串口接收数据,使用超时管理机制
- HAL_UART_Transmit_IT();串口中断模式发送
- HAL_UART_Receive_IT();串口中断模式接收
- HAL_UART_Transmit_DMA();串口DMA模式发送
- HAL_UART_Transmit_DMA();串口DMA模式接收
这几个函数的参数基本都是一样的,我们挑两个讲解一下
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size,uint32_t timeout)
功能:串口发送指定长度的数据。如果超时没发送完成,则不再发送,返回超时标志(HAL_TIMEOUT)。\n\n
参数:
- UART_HandleTypeDef *huart UATR的句柄 如 : UART_HandleTypeDef huart1; 别名就是huart1
- *pData 需要发送的数据
- Size 发送的字节数
- Timeout 最大发送时间,发送数据超过该时间退出发送
串口中断同样重要,这里就不再赘述,具体可看: http://t.csdn.cn/FRaFG
由此可见,串口收发数据主要依靠uint8_t类型的数组等,那如何通过串口收发float类型变量呢?
我们想到,可以借助联合体。具体学习联合体通道:http://t.csdn.cn/EvNf6
我们通过一个例子来简单讲解一下联合体:
运行
观察到,在给联合体变量中一位成员赋值后,另一成员的值也随之确定了。
反过来再验证一遍:
运行
通俗而言,结构体变量中所有成员共用一段空间,因此成员之间的值相互影响,相互制约。
因此,我们可以通过联合体的这一特性,进行串口“收发float型变量”(同样适用于其他数据类型)
这里借用一道题目进行讲解:
第三点,Vpp值可设定
在仅有单片机与电脑的情况下,如何实现?
typedef union float_data
{
float v; //需要设置的Vpp变量
uint8_t byte[4];//定义的串口接受数组
}float_data;
float_data v_data;//联合体变量
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) //串口中断回调
{
if(huart->Instance==huart1.Instance)
{
printf("%.2f",v_data.v); //串口打印需设置的Vpp变量的值
}
HAL_UART_Receive_IT(&huart1,v_data.byte,4);
}
注意,此处printf函数需重写,不然无法打印到串口调试助手
重写方法如下
勾选MicroLIB,否则printf函数无法使用。
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
return ch;
}
重写fputc与fgetc函数
连接单片机,下载烧录,调试
可以看到,通过发送16进制数据,实现了float类型数据的随意设置。