在使用rt-thread nano版本的时候,我们只使用了rt-thread的内核,所以串口函数都是自己写的,但在使用完整版的时候,串口是挂载在设备上面的,那么怎么将打印函数映射到自己想要的串口上呢。
在创建工程的时候我们默认将打印串口设置的是uart2,如下图所示
而rt-thread所有的打印都默认使用了这一串口,如果想要更改串口设置,只要在这里更改uart2为其他的串口就行了,前提是进行过了初始化。
但这明显不是我想要的,我想要的是将不同的打印函数映射到不同的串口上面,rt_kprintf函数好说,只需要一步步去查看调用就能找到最终在那个串口进行打印的,但printf函数明显是调用的库函数,这个不太好查找。
最终查到在rt-thread studio下面,函数使用的好像不是fput这个映射函数,而是_write_r,我不确定这个是不是标准C语言库里的,看着好像是另一个库,因为我使用fput进行重映射却发现根本没有用。
_ssize_t _write_r(struct _reent *ptr, int fd, const void *buf, size_t nbytes)
{
#ifdef DFS_USING_POSIX
_ssize_t rc;
#endif /* DFS_USING_POSIX */
if (fd == STDOUT_FILENO || fd == STDERR_FILENO)
{
#if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE)
rt_device_t console;
console = rt_console_get_device();
if (console)
return rt_device_write(console, -1, buf, nbytes);
#else
ptr->_errno = ENOTSUP;
return -1;
#endif /* defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE) */
}
else if (fd == STDIN_FILENO)
{
ptr->_errno = ENOTSUP;
return -1;
}
#ifdef DFS_USING_POSIX
rc = write(fd, buf, nbytes);
return rc;
#else
LOG_W("%s: %s", __func__, _WARNING_WITHOUT_FS);
ptr->_errno = ENOTSUP;
return -1;
#endif /* DFS_USING_POSIX */
}
这里是库里面实现的代码,文件的位置在/rt-thread/components/libc/compliers/newlib文件夹下,名字是syscalls.c
这里使用了 console = rt_console_get_device();来确定查找的是哪一个设备,
rt_device_t rt_console_get_device(void)
{
return _console_device;
}
返回的值就是之前设置里面的uart2,当然里面的查找过程有些复杂,而要改变这个值就会改变其他打印函数的打印口,所以这里使用console = rt_device_find(“uart1”);这个函数就可以通过字符uart1查找到串口1的设备了,当然前提还是串口1进行初始化挂载到设备树上了。
更改后的代码:
_ssize_t _write_r(struct _reent *ptr, int fd, const void *buf, size_t nbytes)
{
#ifdef DFS_USING_POSIX
_ssize_t rc;
#endif /* DFS_USING_POSIX */
if (fd == STDOUT_FILENO || fd == STDERR_FILENO)
{
#if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE)
rt_device_t console;
// console = rt_console_get_device();
console = rt_device_find("uart1");
if (console)
return rt_device_write(console, -1, buf, nbytes);
#else
ptr->_errno = ENOTSUP;
return -1;
#endif /* defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE) */
}
else if (fd == STDIN_FILENO)
{
ptr->_errno = ENOTSUP;
return -1;
}
#ifdef DFS_USING_POSIX
rc = write(fd, buf, nbytes);
return rc;
#else
LOG_W("%s: %s", __func__, _WARNING_WITHOUT_FS);
ptr->_errno = ENOTSUP;
return -1;
#endif /* DFS_USING_POSIX */
}