STM32F407 UART Связь - PullRequest
       79

STM32F407 UART Связь

0 голосов
/ 23 мая 2018

Я пытаюсь установить связь между моим STM32F4 - Discovery с платой разработки Open 407V-D и периферийным устройством, использующим UART3 в качестве шины RS-485.

У меня проблема с моим соединением из-за состояния RxUART остаются занятыми.

Может кто-нибудь объяснить мне, что я делаю не так?

Должен ли я каким-либо образом отредактировать 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();
}
}


}

Я успешно получил ответ от моего периферийного устройства, но мойкод генерирует Error_Handler () после функции HAL_UART_RxCpltCallback ().

Может кто-нибудь объяснить мне это поведение?

Мои функции обратного вызова:

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 голосов
/ 25 мая 2018

Пожалуйста, укажите количество байтов, которые вы получаете в текущем сценарии.

Некоторые советы по отладке:

  1. Попробуйте увеличить размер буфера и проверьте, получаете ли вы какие-либо данные.

  2. Убедитесь, что вы инициализируете свой буфер после чтения 4 байтов.Если нет, буфер может переполниться и может привести к обработке ошибок.

  3. Убедитесь, что ваш передатчик всегда отправляет 4 байта.

  4. Подтвердите, совпадает ли ваша скорость передачи на обоих устройствах.Кроме того, такие параметры как четность и все одинаковые в приемнике и передатчике.

  5. После каждых 4 байтов вам необходимо снова вызвать HAL_UART_Receive_IT () для настройки и ожидания следующего прерывания.

  6. Также добавьте функцию обратного вызова Error и подтвердите, если выполнение переходит к этому обратному вызову.Если затем добавить распечатки в драйвере, чтобы выяснить причину ошибки, является ли она ошибкой переполнения / ошибкой шума / ошибкой четности и т. Д.

...