打印
[其它应用]

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

[复制链接]
233|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
嵌入式学习、做项目,经常都会用到串口,而用串口最多的时候,就是类似 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;}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

449

主题

1694

帖子

3

粉丝