STM32 HAL 串口发送 485相关函数

stm32f4xx_uart.c
void USART_SendData //标准库中阻塞式发送和接收函数
HAL_StatusTypeDef HAL_UART_Transmit //HAL库中阻塞式发送和接收

FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG)
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
用于检查串口UART1是否发送完成
HAL_UART_Transmit();串口发送数据,使用超时管理机制
HAL_UART_Receive();串口接收数据,使用超时管理机制
HAL_UART_Transmit_IT();串口中断模式发送
HAL_UART_Receive_IT();串口中断模式接收
HAL_UART_Transmit_DMA();串口DMA模式发送
HAL_UART_Transmit_DMA();串口DMA模式接收
————————————————
版权声明:本文为CSDN博主「Z小旋」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/as480133937/article/details/99073783

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
  const uint8_t  *pdata8bits;
  const uint16_t *pdata16bits;
  uint32_t tickstart = 0U;

  /* Check that a Tx process is not already ongoing */
  if (huart->gState == HAL_UART_STATE_READY)
  {
    if ((pData == NULL) || (Size == 0U))
    {
      return  HAL_ERROR;
    }

    /* Process Locked */
    __HAL_LOCK(huart);

    huart->ErrorCode = HAL_UART_ERROR_NONE;
    huart->gState = HAL_UART_STATE_BUSY_TX;

    /* Init tickstart for timeout management */
    tickstart = HAL_GetTick();

    huart->TxXferSize = Size;
    huart->TxXferCount = Size;

    /* In case of 9bits/No Parity transfer, pData needs to be handled as a uint16_t pointer */
    if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
    {
      pdata8bits  = NULL;
      pdata16bits = (const uint16_t *) pData;
    }
    else
    {
      pdata8bits  = pData;
      pdata16bits = NULL;
    }

    /* Process Unlocked */
    __HAL_UNLOCK(huart);

    while (huart->TxXferCount > 0U)
    {
      if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
      {
        return HAL_TIMEOUT;
      }
      if (pdata8bits == NULL)
      {
        huart->Instance->DR = (uint16_t)(*pdata16bits & 0x01FFU);
        pdata16bits++;
      }
      else
      {
        huart->Instance->DR = (uint8_t)(*pdata8bits & 0xFFU);
        pdata8bits++;
      }
      huart->TxXferCount--;
    }

    if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK)
    {
      return HAL_TIMEOUT;
    }

    /* At end of Tx process, restore huart->gState to Ready */
    huart->gState = HAL_UART_STATE_READY;

    return HAL_OK;
  }
  else
  {
    return HAL_BUSY;
  }
}

代码实现讲解
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
返回值:HAL_StatusTypeDef:返回值为HAL_OK、HAL_ERROR、HAL_LOCK、HAL_TIMEOUT等
参数:
UART_HandleTypeDef *huart:UART的别名,如UART_HandleTypeDef huart1; 别名就是huart1;查看系统定义的句柄结构体
*pData:需要发送的数据
uint16_t Size:发送数据的大小
uint32_t Timeout:最大发送时间,发送数据超过该时间退出发送
代码细节(代码历程)
检查有没有正在进行的发送进程–>如果UART的状态是HAL_UART_STATE_READY,那么单片机就检查数据的指针和大小,
如果指针为NULL或者接收到的数据大小为0,任意满足其中的一个则返回错误标志(HAL_ERROR)

### STM32 HAL UART 发送数据 示例代码 为了实现STM32通过UART接口发送数据,需先初始化串口并设置相应的参数。具体操作可以通过STM32CubeMX工具完成配置,包括开启DMA模式下的发送接收中断以及全局中断功能[^2]。 下面是基于HAL编写的一个简单例子来展示如何利用DMA方式经由USART外设向PC端传输字符串消息: ```c #include "main.h" UART_HandleTypeDef huart1; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART1_UART_Init(void); int main(void){ /* Reset of all peripherals, Initializes the Flash interface and Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART1_UART_Init(); char *message = "Hello from STM32 via UART with DMA\r\n"; uint8_t message_len = strlen(message); // Enable DMA request for transmission. __HAL_UART_ENABLE_DMA(&huart1, UART_DMA_REQUEST_TX); // Start sending data using DMA transfer. HAL_UART_Transmit_DMA(&huart1, (uint8_t*)message, message_len); while(1){} } // Initialization function generated by CubeMX tool based on user configuration. static void MX_USART1_UART_Init(void){ huart1.Instance = USART1; huart1.Init.BaudRate = 115200; // Set baud rate to 115200 bps huart1.Init.WordLength = UART_WORDLENGTH_8B;// Use standard byte length huart1.Init.StopBits = UART_STOPBITS_1; // One stop bit used after each frame huart1.Init.Parity = UART_PARITY_NONE; // No parity bits included within frames huart1.Init.Mode = UART_MODE_TX_RX; // Both transmit/receive modes enabled huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;// Hardware flow control disabled here huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK){ Error_Handler(); // If initialization fails, call error handler routine } } ``` 上述程序展示了基本的硬件抽象层(HAL)函数调用来启动一次DMA驱动的数据传送过程。这里`HAL_UART_Transmit_DMA()`被用于触发DMA控制器自动处理整个缓冲区中的字符序列直到全部发出为止[^4]。 当执行此段代码之后,连接至计算机上的终端仿真软件应该能够接收到“Hello from STM32 via UART with DMA”的问候语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值