手中的 ch32v103 板子, flash 着实有限,只有 64KB, 发现无法很好的支持 RT-Thread, 虽然基础的以及移植好了,但是一些 shell 的命令不能很好支持,怀着尝试的心态转到 nano 移植看看,发现 nano 真是精简,移植之后很顺利的可以运行并且 freelist_device 等这些命令都可以正常运行起来。
但是,我接串口发现效果是这样的.
着实不友好,通过网上查询资料
总结来说有三种解决方法:
自己手动添加 'n' 的时候加一个 'r' 回车符号.
修改 putchar() 函数, 打印 'n' 的时候追加打印一个 'r' 符号.
修改串口终端显示的设置, 见到 'n' 的时候,就显示回车换行的效果.
在碰到这个问题的时候:
最开始我试过第三种方法, teraterm 这个串口软件可以配置终端 'n' 也认为是回车换行
在 linux 上使用 kermit 的时候,参考 RT-Thread 的解决方法,选择了第二种.
RT 的处理部分的代码是:
rt_inline int _serial_poll_tx(struct rt_serial_device *serial, const rt_uint8_t *data, int length)
{
int size;
RT_ASSERT(serial != RT_NULL);
size = length;
while (length)
{
/*
* to be polite with serial console add a line feed
* to the carriage return character
*/
if (*data == '
' && (serial->parent.open_flag & RT_DEVICE_FLAG_STREAM))
{
serial->ops->putc(serial, '
');
}
serial->ops->putc(serial, *data);
++ data;
-- length;
}
return size - length;
}
nano 上,我参考之后是这样子的:
static rt_size_t ch32v1_usart_write(rt_device_t serial, rt_off_t pos, const void *buffer, rt_size_t size)
{
struct usart_device *usart_dev;
int i = 0;
RT_ASSERT(serial != RT_NULL);
usart_dev = (struct usart_device *)serial;
RT_ASSERT(usart_dev != RT_NULL);
for (; i < size; i++)
{
USART_SendData(usart_dev->periph, *((uint8_t *)buffer + i));
while (USART_GetFlagStatus(usart_dev->periph, USART_FLAG_TXE) == RESET);
if (*((uint8_t *)buffer + i) == '
' && serial->open_flag & RT_DEVICE_FLAG_STREAM)
{
USART_SendData(usart_dev->periph, '
');
while (USART_GetFlagStatus(usart_dev->periph, USART_FLAG_TXE) == RESET);
}
}
return size;
}
然后就解决了这个问题,现在的效果:
| /
- RT - Thread Operating System
/ | 3.1.5 build Nov 27 2021
2006 - 2021 Copyright by rt-thread team
msh >
msh >
msh >
msh >free
total memory: 16436
used memory : 2576
maximum allocated memory: 2576
msh >
原作者:iysheng
|