電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 115|回復: 0
收起左側(cè)

嵌入式重定向串口的幾種方法

[復制鏈接]

418

主題

418

帖子

4293

積分

四級會員

Rank: 4

積分
4293
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-12-2 11:45:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
關(guān)注+星標公眾,不錯過精彩內(nèi)容
作者 | strongerHuang
微信公眾號 | 嵌入式專欄
嵌入式學習、做項目,經(jīng)常都會用到串口,而用串口最多的時候,就是類似 printf 這種打印輸出的時候。
比如:打印輸出日志信息
打印輸出調(diào)試信息查看實時數(shù)據(jù)等

而 printf 基本都會用到“重定向串口” ,本文結(jié)合這個問題,來簡單分享一下相關(guān)內(nèi)容。嵌入式開發(fā)重定向串口的幾種方法
分享“重定向串口”之前,我們先說說幾種常見的 printf 方式。之前給大家分享的【打印輸出系列教程】其中就提到了,針對MCU的printf打印輸出,常見的方式:1.UART打印輸出2.仿真打印輸出3.SWO打印輸出4.JLink-RTT打印輸出
額外還有一些專有的調(diào)試診斷工具,比如:
5.STM Studio打印輸出變量
6.STM32CubeMonitor打印輸出變量
當然,以上系列教程主要是針對MCU而言,這里說說針對嵌入式開發(fā)的一些常見“重定向”串口的方法。
一、C語言中 printf 重定向在嵌入式C語言中,printf函數(shù)通常用于向控制臺輸出數(shù)據(jù)。但在沒有顯示器的嵌入式系統(tǒng)中,可以通過將stdout(標準輸出)重定向到串口,實現(xiàn)printf的串口輸出。
實現(xiàn)方法:重新定義fputc函數(shù),使其將字符通過串口發(fā)送出去。這樣,每當printf函數(shù)調(diào)用時,就會調(diào)用重新定義的fputc函數(shù),從而將數(shù)據(jù)發(fā)送到串口。
由于單片機性能相對要弱一點針對單片機,我們一般使用微庫(不是標準C庫函數(shù))。

大部分集成開發(fā)環(huán)境(IDE)中都有【使能】微庫的選項。
具體重定向代碼如下:
  • int fputc(int ch, FILE *f){  USART_SendByte((uint8_t)ch);
      return ch;}
    為了方便大家理解,以上提供的是比較簡略的代碼,還有,不同單片機以及不同環(huán)境下,可能略有差異。
    二、shell終端重定向在嵌入式Linux系統(tǒng)中,可以通過修改inittab文件或cmdline參數(shù)來將shell終端重定向到指定串口。例子:在嵌入式Linux系統(tǒng)中,將shell終端重定向到ttyGS0串口:
  • # 修改/etc/inittab文件vim /etc/inittab
    # 找到類似下面的行,并將其修改為指向新的串口# console::respawn:/sbin/getty -L console 115200 vt100ttyGS0::respawn:/sbin/getty -L ttyGS0 115200 vt100在uboot階段通過cmdline參數(shù)指定console到新的串口:
  • console=ttyGS0,115200n8
    三、freopen 重定向標準輸出到串口設備文件這種方法在Linux開發(fā)中比較常見,通過使用 freopen 函數(shù)來重定向標準輸出(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 ------------



    ●專欄《嵌入式工具
    ●專欄《嵌入式開發(fā)》
    ●專欄《Keil教程》
    ●嵌入式專欄精選教程

    關(guān)注公眾號回復“加群”按規(guī)則加入技術(shù)交流群,回復“1024”查看更多內(nèi)容。
    點擊“閱讀原文”查看更多分享。
  • 回復

    使用道具 舉報

    發(fā)表回復

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表