我在一个项目中工作,在这里我需要在uart之间搭建一个桥梁。我使用的是STM32F072CB --基本上,我接收到的uart1 rx的所有数据都必须由uart2 tx发送。以同样的方式,我在uart2 rx中接收到的东西必须通过uart1 tx发送。(这两个uart1都有相同的波特率)。我不知道我能在rx uarts上接收多少数据。
这就是我的想法
Uart1 rx --------> Uart2 tx
Uart1 tx <-------- Uart2 rx我使用DMA和HAL_UARTEx_ReceiveToIdle_DMA来减少cpu处理。
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中断回调函数
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,也就是说,接收一个字符并发送它,但是我得到了相同的结果。
发布于 2022-01-30 23:21:03
因为HAL_UART_Transmit是在“轮询”方法中操作的,所以它在发送所有字符串之前都会停止。
因此,如果在执行HAL_UART_Transmit时出现另一个字符串,则中断不会执行,输入的字符串也会丢失。
在cubemx中激活每个uart的TX之后,尝试应用如下代码。
#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被停用时,最好在将相应的内存值复制到另一个位置之后启用它。
https://stackoverflow.com/questions/70884630
复制相似问题