说明:?rt_kprintf 函数使用时只是指向设置好的调试串口,如果希望其他串口也有类似 rt_kprintf 的功能,本文介绍如何实现。
模仿 rt_kprintf 函数,创建一个指向别的 UART 口的自定义函数。
RT-Thread 自定义 printf 函数
/**
* This function will print a formatted string on system console
* 本函数基于 系统的 rt_kprintf 改动而来,主要改动了 指向串口硬件的变量 yl_uart_device
* @param fmt the format
*/
void yl_kprintf(const char *fmt, ...)
{
rt_device_t yl_uart_device = serial_uart3; /* 定义一个本函数用的串口硬件句柄 */
va_list args;
rt_size_t length;
static char rt_log_buf[RT_CONSOLEBUF_SIZE];
va_start(args, fmt);
/* the return value of vsnprintf is the number of bytes that would be
* written to buffer had if the size of the buffer been sufficiently
* large excluding the terminating null byte. If the output string
* would be larger than the rt_log_buf, we have to adjust the output
* length. */
length = rt_vsnprintf(rt_log_buf, sizeof(rt_log_buf) - 1, fmt, args);
if (length > RT_CONSOLEBUF_SIZE - 1)
length = RT_CONSOLEBUF_SIZE - 1;
if (yl_uart_device == RT_NULL)
{
rt_hw_console_output(rt_log_buf);
}
else
{
rt_uint16_t old_flag = yl_uart_device->open_flag;
yl_uart_device->open_flag |= RT_DEVICE_FLAG_STREAM;
//rt_device_write(serial_uart3, 0, rt_log_buf, length); /* 串口对应 RS232 */
yl_rt_device_write(serial_uart3, 0, rt_log_buf, length);/* 串口对应硬件是RS485接口 */
yl_uart_device->open_flag = old_flag;
}
va_end(args);
}
RTM_EXPORT(yl_kprintf);
/* 自定义串口打印函数,调用这个函数会同时把数据从对应的串口输出 */
/* 这个函数针对 RS485 接口做了适配 */
/* 自定义串口打印函数,调用这个函数会同时把数据从对应的串口输出 */
/* 这个函数针对 RS485 接口做了适配 */
rt_size_t yl_rt_device_write(rt_device_t dev,
rt_off_t pos,
const void *buffer,
rt_size_t size)
{
rt_pin_write(RS485_RE , 1);
rt_device_write(dev, pos, buffer, size);
rt_pin_write(RS485_RE , 0);
return 0;
}
????????函数定义了一个串口专用的句柄,这个句柄可以根据需要从哪个串口打印出数据对应的赋值,或者在其他位置赋值。
rt_device_t yl_uart_device = serial_uart3; /* 定义一个本函数用的串口硬件句柄 */