嵌入式重定向串口的几种方法

文摘   2024-12-02 11:45   四川  

关注+星标公众,不错过精彩内容

作者 | 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库函数)。

大部分集成开发环境(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 <stdio.h>#include <stdlib.h>
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!\n");
return EXIT_SUCCESS;}

今天就分享这么多,还有更多方法,欢迎大家留言说说!

------------ END ------------



●专栏《嵌入式工具

●专栏《嵌入式开发》

●专栏《Keil教程》

●嵌入式专栏精选教程


关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。


点击“阅读原文”查看更多分享。

嵌入式专栏
作者黄工【strongerHuang】,专注分享嵌入式软件、硬件、工具等相关内容,通过专栏形式精选并整理更多嵌入式相关教程。关注并回复“1024”查看更多教程。
 最新文章