STM32F407 UART通信

时间:2018-05-23 09:39:34

标签: stm32 uart rs485

我正在尝试在我的STM32F4 - Discovery与开放式407V-D开发板和使用UART3作为RS-485总线的外设之间建立通信。

我的通讯有问题,因为UART的Rx状态仍然很忙。

有人可以解释一下我做错了什么吗?

我应该以某种方式编辑HAL_UART_IRQHandler或我缺少什么设置?

这是我的代码:

#include "main.h"
#include "stm32f4xx_hal.h"


UART_HandleTypeDef huart3; 
uint8_t Ocular_1_RxBuffer[4]; 
uint8_t Ocular_1_TxBuffer[2] = {0x01,0x86};

__IO ITStatus UartReady;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART3_UART_Init(void);

int main(void)
{


 HAL_Init();
 SystemClock_Config();

 MX_GPIO_Init();
 MX_USART3_UART_Init();


HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);   //set RS 485 into transmit mode

while (1)
{
    int Timeout = 1000000;

while(huart3.gState != HAL_UART_STATE_READY)        //wait for UART
{
    Timeout--;
    if(Timeout == 0) 
    Error_Handler();
}
Timeout = 1000000;
if(HAL_UART_Transmit_IT(&huart3, (uint8_t*)Ocular_1_TxBuffer, 2) != HAL_OK)     //Send request
{
    Error_Handler();
}
while(huart3.RxState != HAL_UART_STATE_READY)                           //wait for UART     
{
    Timeout--;
    if(Timeout == 0) 
    Error_Handler();
}
Timeout = 1000000;
if(HAL_UART_Receive_IT(&huart3, (uint8_t*)Ocular_1_RxBuffer, 4) != HAL_OK)                  //Response
{
    Error_Handler();
}
while(UartReady == RESET)                                               //Wait for response
{
    Timeout--;
    if(Timeout == 0) 
    Error_Handler();
}
}


}

我已成功收到外围设备的响应,但我的代码在HAL_UART_RxCpltCallback()函数之后生成Error_Handler()。

有人可以向我解释一下这种行为吗?

我的回调函数:

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandle)
{
  /* Set transmission flag: transfer complete */
 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);
 UartReady = RESET;

}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
 /* Set transmission flag: transfer complete */
 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);
 UartReady = SET;
}

1 个答案:

答案 0 :(得分:0)

请提及您在当前方案中接收的字节数。

一些调试技巧是 -

  1. 尝试增加缓冲区的大小,并检查是否收到任何数据。

  2. 确保在读取4个字节后重新初始化缓冲区。如果不是,缓冲区可能会溢出并可能导致错误处理程序。

  3. 确保发送器始终发送4个字节。

  4. 确认您的buad率是否与两台设备匹配。此外,奇偶校验和所有设置在接收器和发射器中都是相同的。

  5. 每4个字节后,您需要再次调用HAL_UART_Receive_IT()来配置并等待下一个中断。

  6. 也添加错误回调,并确认执行是否转移到此回调。如果然后在驱动程序中添加打印件以找出错误原因,是否超出错误/噪音错误/奇偶校验错误等。