按照文档中心提供的方法移植FinSH的时候,出现问题感觉移植了半个FinSH,输入的命令只能是单个的单个的,无法连成一条,具体现象如下图所示:
环境:使用的STM32CubeMX6.1.1,Nano版本3.1.3
串口1
添加函数:
void rt_hw_console_output(const char *str)
{
rt_size_t i = 0, size = 0;
char a = '\r';
__HAL_UNLOCK(&huart1);
size = rt_strlen(str);
for (i = 0; i < size; i++)
{
if (*(str + i) == '\n')
{
HAL_UART_Transmit(&huart1, (uint8_t *)&a, 1, 1);
}
HAL_UART_Transmit(&huart1, (uint8_t *)(str + i), 1, 1);
}
}
char rt_hw_console_getchar(void)
{
int ch = -1;
if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET)
{
ch = huart1.Instance->DR & 0xff;
}
else
{
if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_ORE) != RESET)
{
__HAL_UART_CLEAR_OREFLAG(&huart1);
}
rt_thread_mdelay(10);
}
return ch;
}
UART_FLAG_ORE 这个是串口接收溢出中断标志,正常来说串口不应该出现这个错误,至少不应该频繁出现,否则意味者数据已经被丢失了。
造成串口接收溢出错误的原因是串口数据没有被及时取走。
请看下面代码,nano 版本的串口接收实际上是在一个任务中死循环接收数据。这样的做法不太好,死循环会一直占用处理器;但如果在任务中加入睡眠,又会造成接收串口数据不及时。
串口接收应该考虑加入接收缓冲区和信号量。参考完整版的 rt-thread 的做法。
static int finsh_getchar(void)
{
extern char rt_hw_console_getchar(void);
return rt_hw_console_getchar();
}
void finsh_thread_entry(void *parameter)
{
...
...
while (1)
{
ch = finsh_getchar();
if (ch < 0)
{
continue;
}
...
...
}
}
真的吗,下班回去试一试也,好神奇
亲测有效!!感谢感谢