Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【已解决】STM32使用HAL库移植FreeRTOS后再移植Letter Shell后无法输入的BUG #192

Open
cdxiaohuihui opened this issue Jul 15, 2024 · 1 comment

Comments

@cdxiaohuihui
Copy link

使用STM32F103C8T6进行移植,移植完成后打印了Letter Shell的头内容,但是一直无法输入,经过debug调试,发现串口接收到了电脑发送过来的数据,但是一直无法回显,原因是shell.c文件shellTask函数中if (shell->read && shell->read(&data, 1) == 1)此行导致,shellTask函数的原型为:

void shellTask(void *param)
{
    Shell *shell = (Shell *)param;
    char data;
#if SHELL_TASK_WHILE == 1
    while(1)
    {
#endif
        if (shell->read && shell->read(&data, 1) == 1) // 此行存在问题
        {
            shellHandler(shell, data);
        }
#if SHELL_TASK_WHILE == 1
    }
#endif
}

shell->read最终指向了HAL库函数中的HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout),返回值为HAL_StatusTypeDef类型,通过查看HAL_StatusTypeDef的定义,定义原型为:

typedef enum
{
  HAL_OK       = 0x00U,
  HAL_ERROR    = 0x01U,
  HAL_BUSY     = 0x02U,
  HAL_TIMEOUT  = 0x03U
} HAL_StatusTypeDef;

通过HAL_StatusTypeDef的原型可知使用HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)函数接收串口数据成功时返回值为HAL_OK,而shellTask函数中shell->read(&data, 1) == 1HAL_ERROR,所以不会执行shellHandler(shell, data)函数,导致不能输入。通过将shellTask函数中if (shell->read && shell->read(&data, 1) == 1)修改为if (shell->read && shell->read(&data, 1) == **HAL_OK**)即可正常输入。修改后的shellTask的函数如下:

void shellTask(void *param)
{
    Shell *shell = (Shell *)param;
    char data;
#if SHELL_TASK_WHILE == 1
    while(1)
    {
#endif
        if (shell->read && shell->read(&data, 1) == HAL_OK) // 修改此行为HAL_OK
        {
            shellHandler(shell, data);
        }
#if SHELL_TASK_WHILE == 1
    }
#endif
}
@Suaig
Copy link

Suaig commented Jul 22, 2024

这个不能算bug。而且你也不应该改他源代码,你这个问题在于,你的返回值没有按照他的回调函数就设计。我移植的没问题。
short userShellRead(char *data, unsigned short len)
{
//return serialReceive(&debugSerial, (uint8_t )data, len, 0);
if(HAL_UART_Receive(&huart1, (uint8_t
)data, len, 20) == HAL_OK) //这一部分待优化,阻塞式影响操作系统效率
{
return len;
}
else
{
return 0;
}
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants