首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32 Uart桥

STM32 Uart桥
EN

Stack Overflow用户
提问于 2022-01-27 19:30:11
回答 1查看 176关注 0票数 0

我在一个项目中工作,在这里我需要在uart之间搭建一个桥梁。我使用的是STM32F072CB --基本上,我接收到的uart1 rx的所有数据都必须由uart2 tx发送。以同样的方式,我在uart2 rx中接收到的东西必须通过uart1 tx发送。(这两个uart1都有相同的波特率)。我不知道我能在rx uarts上接收多少数据。

这就是我的想法

代码语言:javascript
复制
Uart1 rx --------> Uart2 tx
Uart1 tx <-------- Uart2 rx

我使用DMA和HAL_UARTEx_ReceiveToIdle_DMA来减少cpu处理。

代码语言:javascript
复制
UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;
DMA_HandleTypeDef hdma_usart1_rx;
DMA_HandleTypeDef hdma_usart2_rx;

#define RXBuffSize 10

uint8_t RxBuff1[RxBuffSize];
uint8_t RxBuff2[RxBuffSize];

int main(void)
{
HAL_Init();
SystemClock_Config();

MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
MX_USART2_UART_Init();

HAL_UARTEx_ReceiveToIdle_DMA(&huart1,RxBuff1,RxBuffSize);
__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);
HAL_UARTEx_ReceiveToIdle_DMA(&huart2,RxBuff2,RxBuffSize);
__HAL_DMA_DISABLE_IT(&hdma_usart2_rx,DMA_IT_HT);

while (1)
 {}
}

这是我的DMA中断回调函数

代码语言:javascript
复制
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
    if (huart->Instance == USART1)
    {   
    HAL_UART_Transmit(&huart2,RxBuff1,RxBuffSize,1);
    HAL_UARTEx_ReceiveToIdle_DMA(&huart1,RxBuff1,RxBuffSize);
    __HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);
    } 
    else if (huart->Instance == USART2)
    {
    HAL_UART_Transmit(&huart1,RxBuff2,RxBuffSize,1);
    HAL_UARTEx_ReceiveToIdle_DMA(&huart2,RxBuff2,RxBuffSize);
    __HAL_DMA_DISABLE_IT(&hdma_usart2_rx,DMA_IT_HT);
    }
}

当rx的数据输入较低时,代码将运行。如果我在其他uart的tx中发送了太多的数据,我会得到第一个字节,但会丢失最后一个字节。我还尝试执行RXBuffSize =1,也就是说,接收一个字符并发送它,但是我得到了相同的结果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-30 23:21:03

因为HAL_UART_Transmit是在“轮询”方法中操作的,所以它在发送所有字符串之前都会停止。

因此,如果在执行HAL_UART_Transmit时出现另一个字符串,则中断不会执行,输入的字符串也会丢失。

在cubemx中激活每个uart的TX之后,尝试应用如下代码。

代码语言:javascript
复制
#include <string.h>

uint8_t TxBuff1[RxBuffSize];
uint8_t TxBuff2[RxBuffSize];

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
    Size = Size > RxBuffSize ? RxBuffSize : Size;

    if (huart->Instance == USART1)
    {   
        memcpy(TxBuff2, RxBuff1, Size);
        HAL_UART_Transmit_DMA(&huart2, TxBuff2, Size);
        HAL_UARTEx_ReceiveToIdle_DMA(&huart1, RxBuff1, RxBuffSize);
        __HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_HT);
    } 
    else if (huart->Instance == USART2)
    {
        memcpy(TxBuff1, RxBuff2, Size);
        HAL_UART_Transmit_DMA(&huart1, TxBuff1, Size);
        HAL_UARTEx_ReceiveToIdle_DMA(&huart2, RxBuff2, RxBuffSize);
        __HAL_DMA_DISABLE_IT(&hdma_usart2_rx, DMA_IT_HT);
    }
}

直接传输RxBuff是危险的。当在发送时从UART接收到一个字符时,TX可能会发送一个不正确的值,因为RX改变了相应内存中的值。

因此,当RX被停用时,最好在将相应的内存值复制到另一个位置之后启用它。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70884630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档