STM32 - RS485 запрос-ответ

Я пытаюсь отправить запрос на измерительное устройство и получить ответ с помощью UART с прерываниями. Однако связь нестабильна, я получаю неполные или искаженные ответы. Я не уверен, но думаю, это из-за сигнала включения драйвера переключения. Не могли бы вы взглянуть на мой код и дать мне совет, что я делаю не так?

Вот мой код:

int main(void){

HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART3_UART_Init();  

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

while (1)
{

        if(HAL_UART_Transmit_IT(&huart3, (uint8_t*)aTxBuffer, 2) != HAL_OK)
        {
            while(1);
        }
        while (UartReady != SET);
        UartReady = RESET;
        if(HAL_UART_Receive_IT(&huart3, (uint8_t*)aRxBuffer, 4) != HAL_OK)
        {
            while(1);
        }
        while (UartReady != RESET);
        //do somethink with received data
          }
}

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

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandle)
{
/* Set transmission flag: transfer complete */
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);     //RS 485 receive mode
//DataRecieved = 0;
UartReady = SET;
}

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

Большое тебе спасибо


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


Ответы (2)


Данные, которые вы передаете, также появляются в вашем RX-буфере, в то время как вы ожидаете, что этого не будет?

person Stian Skjelstad    schedule 15.05.2018

Я получаю неполные или искаженные ответы. Я не уверен, но думаю, это из-за сигнала включения драйвера переключения. Не могли бы вы взглянуть на мой код и дать мне совет, что я делаю не так?

Не уверен, но, возможно, это поможет переключить вывод DE не в функциях обратного вызова прерывания, а вместо этого переключиться в «режим передачи» прямо перед вызовом HAL_UART_Transmit_IT (), а затем переключиться обратно в режим приема после передачи или даже после вызова HAL_UART_Receive_IT (), чтобы убедиться, что он перехватит входящие байты. Иногда небольшие задержки имеют значение:

void set_transmit_mode(void)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);  // RS 485 transmit mode
}

void set_receive_mode(void)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET); // RS 485 receive mode
}

{
    //...
    set_transmit_mode();
    if (HAL_UART_Transmit_IT(&huart3, (uint8_t*)aTxBuffer, 2) != HAL_OK) {
       // ...
    }
    while (UartReady != SET);
    //set_receive_mode();
    UartReady = RESET;
    if (HAL_UART_Receive_IT(&huart3, (uint8_t*)aRxBuffer, 4) != HAL_OK) {
        // ...
    }
    set_receive_mode();
    while (UartReady != RESET);
    //...
}
person rel    schedule 21.05.2018