Ubuntu下串口工具 PicoCOM 的使用和時間戳顯示

来源:https://www.cnblogs.com/milton/archive/2023/05/14/17399974.html
-Advertisement-
Play Games

Ubuntu下的串口軟體, 除了 CuteCOM, screen, MiniCOM 以外, 還有一個和 MiniCOM 很像的 PicoCOM. 最近在調試 CH340C 串口的過程中, 發現只有 PicoCOM 的連接Reset才能正常工作, 因此單獨記錄一下. ...


PICOCOM

Ubuntu下的串口軟體, 除了 CuteCOM, screen, MiniCOM 以外, 還有一個和 MiniCOM 很像的 PicoCOM. 最近在調試 CH340C 串口的過程中, 發現只有 PicoCOM 的連接Reset才能正常工作, 因此單獨記錄一下.

安裝

在 Ubuntu 上直接通過sudo apt install picocom安裝, 版本是3.1

使用

連接和斷開

使用 115200 波特率連接串口設備 /dev/ttyUSB0

picocom -b115200 /dev/ttyUSB0

斷開有兩種方式

  • Ctrl+A, Ctrl+Q 退出, NO RESET
  • Ctrl+A, Ctrl+X 退出, RESET

在串口通信時, RTS(Ready To Send)會處於低電平, 當斷開串口時如果RESET, 就會恢復高電平, 預設會進行RESET.

在調試STC單片機的時候, 往往會使用帶自動燒錄的串口轉USB設備連接, 而這種設備的自動燒錄機制, 就是通過拉低RTS觸發MCU斷電重啟. 在使用這種RTS觸發的設備進行燒錄和調試時, 就要靈活使用RESET機制.

  • 當進行調試時, 我們不希望每次連接MCU時自動重啟, 因此斷開串口時要避免RESET, 讓RTS一直處於低電平, 斷開連接時使用 Ctrl+A Ctrl+Q 退出, 可以避免RESET
  • 當進行燒錄時, 如果RTS還處於低電平, 拉低RTS無效, 導致無法重啟MCU. 所以在燒錄時, 斷開串口要RESET, 讓RTS回到高電平, 使用 Ctrl+A Ctrl+X 退出

PS: 這個功能在 picocom 上工作是正常的, 但是在 minicom 上工作不正常, 使用 Ctrl+A, Q 退出一次之後, 無論再使用 Ctrl+A,X, 還是 Ctrl+A,Q 都無法再觸發 RESET

顯示二進位

在調試串口通信時, 有時候需要觀察串口的二進位輸出, 這時候就需要將數據通過16進位列印出來, 在 picocom 下需要用 --imap 參數, 這個參數是一個多選項, 可以區分不同類型的數值進行轉換.

--imap <map> (input mappings)
<map> is a comma-separated list of one or more of ...

例如

picocom --imap spchex,tabhex,crhex,lfhex,nrmhex,8bithex -b 19200 /dev/ttyS0

各參數的說明

  • spchex (map special chars (< 0x20 || 0x7f), excl. CR, LF, and TAB to hex)
  • tabhex (map TAB to hex)
  • crhex (map CR to hex)
  • lfhex (map LF to hex)
  • 8bithex (map chars with 8th-bit set to hex)
  • nrmhex (map normal ascii chars (0x20 <= c < 0x7f) to hex)

二次開發: 增加時間戳

調試串口時經常會用到時間戳, 例如觀察延時是否正確. 雖然這個時間戳並不准確, 但是作為一個粗略的時間標記還是非常方便的. minicom在較新的版本中已經支持時間戳輸出, 但是 picocom 上還沒有這個功能.

開源軟體的好處就在於, 用得不順手可以自己改. 在 picocom 上增加時間戳輸出也並不麻煩.

先通過項目倉庫 https://github.com/npat-efault/picocom 導出代碼, 直接make編譯驗證環境是否正確. 如果編譯不成功先解決編譯環境問題.

而後是修改代碼, 主要修改的部分都在 picocom.c

頭文件引入 sys/time.h, 因為會用到時間取值函數

#include <sys/time.h>

增加定義, n/N 這個參數用於開關/選擇時間戳格式

#define KEY_TIMESTAMP CKEY('n') /* show timestamp */

在結構體 struct { ... } opts 中增加一個欄位 int timestamp; 用於記錄時間戳選項

在幫助顯示中增加按鍵提示

    fd_printf(STO, "*** [C-%c] : Toggle display timestamp\r\n",
              KEYC(KEY_TIMESTAMP));

增加對應的按鍵處理

    case KEY_TIMESTAMP:
        opts.timestamp = (opts.timestamp + 1) % 4;
        fd_printf(STO, "\r\n*** display timestamp, format:%d ***\r\n",
                  opts.timestamp);

在輸出部分, 增加時間戳的生成方法, 這裡會產生4種顯示方式, 0:不顯示, 1:分:秒, 2:時:分:秒, 3:年-月-日 時:分:秒

/* print leading timestamp */
void print_lead_str(void)
{
    struct timeval tv;
    struct tm lt = {0};
    char buff[32], buff2[64];

    gettimeofday(&tv, NULL);
    localtime_r(&(tv.tv_sec), &lt);

    switch (opts.timestamp) {
    case 3:
        strftime(buff, sizeof(buff), "%Y-%m-%d %H:%M:%S", &lt);
        sprintf(buff2, "%s.%03ld ", buff, tv.tv_usec / 1000);
        write(STO, buff2, 24);
        break;
    case 2:
        strftime(buff, sizeof(buff), "%H:%M:%S", &lt);
        sprintf(buff2, "%s.%03ld ", buff, tv.tv_usec / 1000);
        write(STO, buff2, 13);
        break;
    case 1:
        strftime(buff, sizeof(buff), "%M:%S", &lt);
        sprintf(buff2, "%s.%03ld ", buff, tv.tv_usec / 1000);
        write(STO, buff2, 10);
        break;
    default:
        break;
    }
}

在顯示中增加調用

        if ( FD_ISSET(tty_fd, &rdset) ) {

            char buff_rd[TTY_RD_SZ];
            char buff_map[TTY_RD_SZ * M_MAXMAP];

            /* read from port */

            do {
                n = read(tty_fd, &buff_rd, sizeof(buff_rd));
            } while (n < 0 && errno == EINTR);
            if (n == 0) {
                fatal("read zero bytes from port");
            } else if ( n < 0 ) {
                if ( errno != EAGAIN && errno != EWOULDBLOCK )
                    fatal("read from port failed: %s", strerror(errno));
            } else {
                print_lead_str();                       //<--- 輸出時間戳
                int i;
                char *bmp = &buff_map[0];
                if ( opts.log_filename )
                    if ( writen_ni(log_fd, buff_rd, n) < n )
                        fatal("write to logfile failed: %s", strerror(errno));
                for (i = 0; i < n; i++) {
                    bmp += do_map(bmp, opts.imap, buff_rd[i]);
                }
                n = bmp - buff_map;
                if ( writen_ni(STO, buff_map, n) < n )
                    fatal("write to stdout failed: %s", strerror(errno));
            }
        }

詳細的代碼改動可以參考

https://github.com/IOsetting/picocom

除了增加了 -N 參數顯示時間戳功能, 還修改了預設的通信波特率, 將 9600 改為 115200, 因為現在基本上都是 115200 了. 運行make編譯後可以直接使用.

在通信過程中通過 Ctrl+A Ctrl+N 依次切換不同顯示格式, 也可以在啟動時直接指定, 例如

./picocom --imap nrmhex,8bithex /dev/ttyUSB0 -N3

參考


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一 進程對象及其他方法 '''一臺電腦上面運行著很多進程,那麼電腦是如何區分並管理這些進程服務端的呢?電腦會給每一個運行的進程分配一個PID號如何查看 windows電腦 進入cmd輸入tasklist即可查看 tasklist|findstr PID查看具體的進程 linux電腦 進入終端之 ...
  • ABP框架 ABP是用於創建現代化Web應用程式的完整體繫結構和強大的基礎架構,以模塊化的方式進行開發,所有模塊以nuget包的方式提供,開箱即用,遵循最佳實踐和約定,提供SOLID開發經驗。 | 縮寫 | 英文 | 中文 | |--|--|--| | SRP | The Single Respon ...
  • 一、概述 PUT 和 PATCH 方法用於更新現有資源。 它們之間的區別是,PUT 會替換整個資源,而 PATCH 僅指定更改。 在 ASP.NET Core Web API 中,由於 C# 是一種靜態語言(dynamic 在此不表),當我們定義了一個類型用於接收 HTTP Patch 請求參數的時 ...
  • 前言 之前有個項目需要執行一個略微耗時的操作大概五六七八九十秒這樣子,這個時候程式不能做其他操作,只能等待操作完成。為了提升一絲使用體驗同時讓Winform程式看上去高級一點🎃🎃🎃,就想到加一個遮罩層(MaskLayer)。雖然Winform沒有原生的遮罩層,但是實現起來也不是很麻煩。 遮罩層 ...
  • 目錄 沁恆 CH32V208(一): CH32V208WBU6 評估板上手報告和Win10環境配置 沁恆 CH32V208(二): CH32V208的儲存結構, 啟動模式和時鐘 沁恆 CH32V208(三): CH32V208 Ubuntu22.04 Makefile VSCode環境配置 沁恆 C ...
  • 以 redhat7.4為例,網上的解決方案多是針對ubuntu的,需要進入ubuntu的預覽系統,redhat好像沒這個東西 問題:新添磁碟後開機無法進入系統。 似乎是因為電腦將新增的空硬碟作為了系統盤進行啟動,所以無法啟動系統。 解決方案:只要讓電腦將裝有linux系統的硬碟進行啟動就可以解決 ...
  • 切換 Windows 的系統語言 Windows 10 專業版 (1)點擊左下角開始菜單欄 --> 設置 --> 時間和語言 --> 語言。 (2)點擊添加語言,在彈出的列表框中,選擇你要安裝的語言。 (3)下載完語言包後,點擊 Windows 顯示語言下拉框,選擇剛剛安裝的語言。 (4)選擇新的語 ...
  • 定時器詳解 引出 定時器是一個比較常見的數據結構,或者說框架,以一個最簡單的例子引出,在游戲中,冷卻時間使用的就是定時器; 所以說定時器是**等待時間過期執行對應時間事件處理( 回調函數 )**的一個框架; 補充:下文中可能會出現定時任務,它和時間事件基本上是一個東西 那麼現在有一個就有一個問題,該 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...