关注+星标公众号,不错过精彩内容
作者 | strongerHuang
微信公众号 | 嵌入式专栏
嵌入式学习、做项目,经常都会用到串口,而用串口最多的时候,就是类似 printf 这种打印输出的时候。
比如:打印输出日志信息
打印输出调试信息查看实时数据等
而 printf 基本都会用到“重定向串口” ,本文结合这个问题,来简单分享一下相关内容。嵌入式开发重定向串口的几种方法
分享“重定向串口”之前,我们先说说几种常见的 printf 方式。之前给大家分享的【打印输出系列教程】其中就提到了,针对MCU的printf打印输出,常见的方式:1.UART打印输出2.仿真打印输出3.SWO打印输出4.JLink-RTT打印输出
额外还有一些专有的调试诊断工具,比如:
5.STM Studio打印输出变量
6.STM32CubeMonitor打印输出变量
当然,以上系列教程主要是针对MCU而言,这里说说针对嵌入式开发的一些常见“重定向”串口的方法。
一、C语言中 printf 重定向在嵌入式C语言中,printf函数通常用于向控制台输出数据。但在没有显示器的嵌入式系统中,可以通过将stdout(标准输出)重定向到串口,实现printf的串口输出。
实现方法:重新定义fputc函数,使其将字符通过串口发送出去。这样,每当printf函数调用时,就会调用重新定义的fputc函数,从而将数据发送到串口。
由于单片机性能相对要弱一点针对单片机,我们一般使用微库(不是标准C库函数)。
ppbwcwsdnbt64058829213.png
大部分集成开发环境(IDE)中都有【使能】微库的选项。
具体重定向代码如下:int fputc(int ch, FILE *f){ USART_SendByte((uint8_t)ch);
return ch;}
为了方便大家理解,以上提供的是比较简略的代码,还有,不同单片机以及不同环境下,可能略有差异。
二、shell终端重定向在嵌入式Linux系统中,可以通过修改inittab文件或cmdline参数来将shell终端重定向到指定串口。例子:在嵌入式Linux系统中,将shell终端重定向到ttyGS0串口:# 修改/etc/inittab文件vim /etc/inittab
# 找到类似下面的行,并将其修改为指向新的串口# console::respawn:/sbin/getty -L console 115200 vt100ttyGS0::respawn:/sbin/getty -L ttyGS0 115200 vt100在uboot阶段通过cmdline参数指定console到新的串口:console=ttyGS0,115200n8
三、freopen 重定向标准输出到串口设备文件这种方法在Linux开发中比较常见,通过使用 freopen 函数来重定向标准输出(stdout)到一个串口设备文件。
比如将 stdout 重定向到串口设备文件(例如 /dev/ttyS0):#include #include
int main() { // 串口设备文件的路径,例如 /dev/ttyS0 const char *serial_port = "/dev/ttyS0"; // 使用 freopen 重定向 stdout 到串口设备文件 FILE *new_stdout = freopen(serial_port, "w", stdout); if (new_stdout == NULL) { perror("freopen failed"); return EXIT_FAILURE; }
// 测试输出到串口 printf("Hello, serial port!
");
return EXIT_SUCCESS;}
今天就分享这么多,还有更多方法,欢迎大家留言说说!
------------ END ------------
51yeaecxqan64058829313.gif
●专栏《嵌入式工具》
●专栏《嵌入式开发》
●专栏《Keil教程》
●嵌入式专栏精选教程
关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。
点击“阅读原文”查看更多分享。 |