使用HAL在STM32F303上进行串行通信-Rx无法正常工作

时间:2018-10-23 18:52:33

标签: serial-port embedded stm32 hal usart

我正在使用连接到我自己的PCB上的STM32F303RE Nucleo板进行RS-232串行通信,我无法弄清楚为什么此代码在某些情况下不起作用。

我正在使用HAL函数(HAL_UART_Transmit和HAL_UART_Receive)进行通信,使用了适用于usart2的Nucleo上的USB连接器以及适用于usart1的自己PCB上的9针RS-232串行端口。两种usart配置均由HAL设置。

当我仅使用USB连接(usart2)进行通信(使用Putty端子)时,代码工作正常。当我将usart1用于Tx和usart2用于Rx时,仍然没有问题。当我将usart2用于Tx并将usart1用于Rx时,它也可以正常工作。

问题是当我尝试同时使用usart1(这是我的RS-232电缆)同时用于Tx和Rx时。我的处理器可以很好地传输初始数据,但是当需要接收数据时,什么也没有使它进入接收的数据寄存器。我有一些代码可以简单地在传输线上回显任何接收到的数据,并且在此配置中没有任何结果。再说一遍-该代码在usart1和usart2的其他所有配置中均可正常工作,以便进行发送和接收,但是当我尝试在usart1(RS-232)上进行所有操作时,则没有Rx

这是我正在使用的代码的相关部分。 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; }

我不明白为什么完全相同的代码会在4种情况中的3种而不是4种情况下工作。我已经检查了串行电缆,当仅用于Tx或仅用于Rx时,其余RS-232硬件功能正常。但是,当试图同时使用RS-232时,Rx似乎受到某种阻碍。

编辑:添加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__);
  }

}

0 个答案:

没有答案