STM32F407 UART Связь

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

У меня проблема со связью, потому что состояние Rx UART остается занятым.

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

Следует как-то отредактировать 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;
}

person V.CHR.    schedule 23.05.2018    source источник


Ответы (1)


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

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

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

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

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

  4. Убедитесь, что ваша скорость загрузки совпадает на обоих устройствах. Также настройки, такие как четность, и все они одинаковы в приемнике и передатчике.

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

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

person antish    schedule 25.05.2018
comment
У меня увеличился размер буферов Tx и Rx, и я получаю 4 байта, если у меня есть точка останова в моей функции RxCpltCallback, но когда я удаляю эту точку останова и смотрю, что происходит в окне просмотра, я вижу, что иногда я получаю только 2 байта или 1 байт. Может ли такое поведение быть вызвано отсутствием точек останова в отладчике? Также я нашел эту тему: community.st.com/thread/9360 Вы думаете, что я та же проблема, что и в теме выше? - person V.CHR.; 28.05.2018