Последовательная связь на STM32F303 с использованием HAL - Rx не работает - PullRequest
0 голосов
/ 23 октября 2018

Я использую плату STM32F303RE Nucleo, подключенную к моей собственной печатной плате, для последовательной связи RS-232, и я не могу понять, почему этот код не работает при определенных обстоятельствах.

Я использую функции HAL (HAL_UART_Transmit и HAL_UART_Receive) для своих сообщений, используя разъем USB на Nucleo для usart2 и 9-контактный последовательный порт RS-232 на моей собственной плате для usart1.Обе конфигурации usart были настроены HAL.

Когда я общаюсь (используя терминал Putty), используя только соединение USB (usart2), код работает отлично.Когда я использую usart1 для Tx и usart2 для Rx, все еще никаких проблем.Когда я использую usart2 для Tx и usart1 для Rx, это также работает нормально.

Проблема в том, что я пытаюсь использовать usart1 (это мой кабель RS-232) для Tx и Rx.Мой процессор отлично передает исходные данные, но когда приходит время получать данные, ничто не попадает в регистр полученных данных.У меня есть некоторый код, который просто возвращает любые полученные данные по линии передачи, и в этой конфигурации ничего не получается.Еще раз - код прекрасно работает в любой другой конфигурации usart1 и usart2 для отправки и получения, но не Rx, когда я пытаюсь сделать все это на usart1 (RS-232)

Вот соответствующий разделкод, который я использую.COMTYPE имеет значение либо & huart1, либо & huart2 (в случае проблемы - & huart1)

Основной цикл (полученные данные используются для оператора switch в системе меню):

    HAL_UART_Transmit(COMTYPE, prompt, sizeof(prompt), TIMEOUT);
    cmd_size = UART_getstr(command);

    cmd_num = parse_menu_input(command, cmd_size);
    converted = (uint8_t)cmd_num + '0';


    // error parsing command for menu selection
    if(cmd_num == -1){
        HAL_UART_Transmit(COMTYPE, parse_error, sizeof(parse_error), TIMEOUT);
    }
    else{
        menu_switch(cmd_num);
    }
}

Функция, содержащаяФункция Rx и функция эхо-возврата (Tx):

int UART_getstr(uint8_t* command){

int x = 0;              // tracker for buffer pointer
int chars = 0;
uint8_t buffer;     // single char storage for UART receive

while(1){       

    // get single char from UART_Receive
    HAL_UART_Receive(COMTYPE, &buffer, 1, HAL_MAX_DELAY);
    // echo back function
    HAL_UART_Transmit(COMTYPE, &buffer, sizeof(char), TIMEOUT);

    // write value of received char to "command" array
    command[x] = buffer;

    // increment the number of valid chars
    chars++;

    // stop adding chars to command after [Enter] pressed
    if(command[x] == '\r'){
        chars--;
        break;
    }
    // correct for storing DELETE as char in buffer
    if(command[x] == 0x7F){
        command -= 1;
        chars -= 2;
    }
    else{
        x++;
    }
}
command[x] = '\0';

// return length of command buffer
return chars; }

Я не понимаю, почему один и тот же код будет работать в 3 из 4 случаев, но не в 4-м.Я проверил последовательный кабель, и остальная часть аппаратного обеспечения RS-232 прекрасно работает, когда используется ТОЛЬКО для Tx или ТОЛЬКО для Rx.Но Rx кажется заблокированным чем-то при попытке использовать RS-232 для обоих.

РЕДАКТИРОВАТЬ: Добавление кода инициализации UART (генерируется HAL):

/* USART1 init function */
static void MX_USART1_UART_Init(void)
{

  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

/* USART2 init function */
static void MX_USART2_UART_Init(void)
{

  huart2.Instance = USART2;
  huart2.Init.BaudRate = 115200;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}
...