簡體   English   中英

STM32F407 UART通信

[英]STM32F407 UART Communication

我試圖在我的STM32F4-帶Open 407V-D開發板的Discovery和使用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. 嘗試增加緩沖區的大小,然后檢查是否接收到任何數據。

  2. 確保在讀取4個字節后重新初始化緩沖區。 否則,緩沖區可能溢出,並可能導致錯誤處理程序。

  3. 確保發射機始終發送4個字節。

  4. 確認兩個設備上的Buad速率是否匹配。 接收器和發送器中的奇偶校驗等設置也相同。

  5. 每4個字節之后,您需要再次調用HAL_UART_Receive_IT()進行配置,並等待下一個中斷。

  6. 也添加錯誤回調,並確認執行是否移至該回調。 如果然后在驅動程序中添加打印以找出導致錯誤的原因,如溢出錯誤/噪聲錯誤/奇偶錯誤等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM