HAL库 STM32 单/多串口重定向使用-CUBE MX

以此博客记录在CUBE MX环境下,单片机使用单串口重定向或多串口同时使用的学习。

如果有误或能改进的地方,多多相互交流。

 

 

一丶一般单串口重定向

两种方法都需添加头文件 : #include <stdio.h>

方法一:

   int fputc(int ch, FILE *f)
   {     
    while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (uint8_t) ch;      
    return ch;
   }  

方法二:

int fputc(int ch, FILE *f)
 {
    //具体哪个串口可以更改huart1为其它串口
    HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1 , 0x0f);
    return ch;
 }

二丶多串口同时调用重定向

2.1 cube Mx的配置

   多串口与单串口一样,只需打开所需串口即可,其余配置默认。

 2.2 代码的添加

2.2.1 添加头文件stdarg.h、stdio.h和string.h 

2.2.2 添加代码

在BEGIN 与 END 中间添加代码,后续CUBEMX更新代码时才不会被刷新。

代码如下:

void print(UART_HandleTypeDef* huart, const char* buf, ...)
{
  const char *p = buf;
  char str[255] = {0};
  va_list v;
  va_start(v, buf);
  vsprintf(str, buf, v); //使用可变参数的字符串打印。类似sprintf
  HAL_UART_Transmit(huart, str, strlen(str), 0xff);
  va_end(v);
}

//注: 有报警,不影响

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: 在STM32 HAL中,可以通过使用多个串口来实现同时通信。下面是一个简的例程,展示了如何使用两个串口进行通信。 首先,我们需要初始化两个串口,假设它们分别为USART1和USART2。在main函数中,我们需要先初始化HAL串口,然后设置串口的参数。 ```c #include "stm32f4xx.h" #include "stm32f4xx_hal.h" UART_HandleTypeDef huart1; UART_HandleTypeDef huart2; ``` 接下来,我们需要实现一个函数来进行串口的发送和接收: ```c void UART_Transmit(UART_HandleTypeDef *huart, uint8_t *data, uint16_t size) { HAL_UART_Transmit(huart, data, size, HAL_MAX_DELAY); } void UART_Receive(UART_HandleTypeDef *huart, uint8_t *data, uint16_t size) { HAL_UART_Receive(huart, data, size, HAL_MAX_DELAY); } ``` 在主函数中,我们可以通过不同的串口来发送和接收数据。下面是一个简的例子,展示了如何同时使用两个串口进行通信: ```c int main(void) { HAL_Init(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_USART1_CLK_ENABLE(); __HAL_RCC_USART2_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART1; GPIO_InitStruct.Pin = GPIO_PIN_9; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Alternate = GPIO_AF7_USART2; GPIO_InitStruct.Pin = GPIO_PIN_2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); huart1.Instance = USART1; huart1.Init.BaudRate = 9600; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; HAL_UART_Init(&huart1); huart2.Instance = USART2; huart2.Init.BaudRate = 115200; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; HAL_UART_Init(&huart2); uint8_t data1[] = "USART1"; uint8_t data2[] = "USART2"; uint8_t rx_data1[8]; uint8_t rx_data2[8]; while (1) { UART_Transmit(&huart1, data1, sizeof(data1)); UART_Receive(&huart2, rx_data2, sizeof(rx_data2)); UART_Transmit(&huart2, data2, sizeof(data2)); UART_Receive(&huart1, rx_data1, sizeof(rx_data1)); } } ``` 在这个例程中,我们使用USART1发送数据"USART1",并通过USART2接收数据。然后我们使用USART2发送数据"USART2",并通过USART1接收数据。通过在循环中反复执行这些步骤,就实现了两个串口的同时通信。 需要注意的是,以上只是一个简的例程,实际的应用中可能涉及更多的串口通信代码和处理逻辑。这个例子可以作为一个入门的起点,帮助您理解STM32 HAL多个串口同时通信的实现方式。 ### 回答2: 在STM32 HAL中,可以使用多个串口同时进行通信。为了实现多个串口同时通信,我们需要进行以下几个步骤: 1. 初始化串口:首先,我们需要对每个使用串口进行初始化。可以使用`HAL_UART_Init()`函数来初始化串口,并指定相应的串口编号和波特率。 2. 配置串口参数:在初始化完成后,我们可以使用`HAL_UART_MspInit()`函数来配置串口的参数,比如设置数据位、停止位、校验位等。此函数应该在`HAL_UART_Init()`函数之后调用。 3. 设置中断:为了实现串口的接收和发送中断处理,我们需要设置相应的中断。可以使用`HAL_UART_Receive_IT()`函数来设置串口接收中断,并使用`HAL_UART_Transmit_IT()`函数设置发送中断。 4. 编写中断处理函数:为每个串口编写相应的中断处理函数。在接收中断函数中,我们可以使用`HAL_UART_Receive_IT()`函数来接收数据并处理。在发送中断函数中,我们可以使用`HAL_UART_Transmit_IT()`函数来发送数据。 5. 启动通信:完成上述步骤后,我们就可以启动串口通信。可以使用`HAL_UART_Transmit()`函数来发送数据,使用`HAL_UART_Receive()`函数来接收数据。 需要注意的是,在进行多个串口同时通信时,要确保每个串口的缓冲区大小足够大,以防止数据丢失。此外,还可以使用DMA传输来提高通信效率。 总结起来,实现STM32 HAL多个串口同时通信的步骤包括初始化串口、配置串口参数、设置中断、编写中断处理函数和启动通信。通过合理的设计和管理,就可以实现多个串口的同时通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我Bu秃头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值