We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
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
使用STM32F103C8T6进行移植,移植完成后打印了Letter Shell的头内容,但是一直无法输入,经过debug调试,发现串口接收到了电脑发送过来的数据,但是一直无法回显,原因是shell.c文件shellTask函数中if (shell->read && shell->read(&data, 1) == 1)此行导致,shellTask函数的原型为:
shell.c
shellTask
if (shell->read && shell->read(&data, 1) == 1)
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的定义,定义原型为:
shell->read
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
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) == 1为HAL_ERROR,所以不会执行shellHandler(shell, data)函数,导致不能输入。通过将shellTask函数中if (shell->read && shell->read(&data, 1) == 1)修改为if (shell->read && shell->read(&data, 1) == **HAL_OK**)即可正常输入。修改后的shellTask的函数如下:
HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
HAL_OK
shell->read(&data, 1) == 1
HAL_ERROR
if (shell->read && shell->read(&data, 1) == **HAL_OK**)
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 }
The text was updated successfully, but these errors were encountered:
这个不能算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; } }
Sorry, something went wrong.
No branches or pull requests
使用STM32F103C8T6进行移植,移植完成后打印了Letter Shell的头内容,但是一直无法输入,经过debug调试,发现串口接收到了电脑发送过来的数据,但是一直无法回显,原因是
shell.c
文件shellTask
函数中if (shell->read && shell->read(&data, 1) == 1)
此行导致,shellTask
函数的原型为:shell->read
最终指向了HAL库函数中的HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
,返回值为HAL_StatusTypeDef
类型,通过查看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) == 1
为HAL_ERROR
,所以不会执行shellHandler(shell, data)函数,导致不能输入。通过将shellTask
函数中if (shell->read && shell->read(&data, 1) == 1)
修改为if (shell->read && shell->read(&data, 1) == **HAL_OK**)
即可正常输入。修改后的shellTask
的函数如下:The text was updated successfully, but these errors were encountered: