Ubuntu下串口工具 PicoCOM 的使用和时间戳显示

科技资讯 投稿 6700 0 评论

Ubuntu下串口工具 PicoCOM 的使用和时间戳显示

PICOCOM

    GitHub 仓库 https://github.com/npat-efault/picocom
    • 仓库的所有者 Nick Patavalis (npat-efault 在 2018 年之后就未再更新
    • 在 Ubuntu22.04 下能编译通过并正常工作
  • GitLab 分支仓库 https://gitlab.com/wsakernel/picocom
      Wolfram Sang 维护的, 在原仓库基础上继续开发的一个版本

安装

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

使用

连接和断开

picocom -b115200 /dev/ttyUSB0

断开有两种方式

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

在调试STC单片机的时候, 往往会使用带自动烧录的串口转USB设备连接, 而这种设备的自动烧录机制, 就是通过拉低RTS触发MCU断电重启. 在使用这种RTS触发的设备进行烧录和调试时, 就要灵活使用RESET机制。

    当进行调试时, 我们不希望每次连接MCU时自动重启, 因此断开串口时要避免RESET, 让RTS一直处于低电平, 断开连接时使用 Ctrl+A Ctrl+Q 退出, 可以避免RESET
  • 当进行烧录时, 如果RTS还处于低电平, 拉低RTS无效, 导致无法重启MCU. 所以在烧录时, 断开串口要RESET, 让RTS回到高电平, 使用 Ctrl+A Ctrl+X 退出

显示二进制

在调试串口通信时, 有时候需要观察串口的二进制输出, 这时候就需要将数据通过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

二次开发: 增加时间戳

开源软件的好处就在于, 用得不顺手可以自己改. 在 picocom 上增加时间戳输出也并不麻烦。

make编译验证环境是否正确. 如果编译不成功先解决编译环境问题。

头文件引入 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;
            }
        }

详细的代码改动可以参考

除了增加了 -N 参数显示时间戳功能, 还修改了默认的通信波特率, 将 9600 改为 115200, 因为现在基本上都是 115200 了. 运行make编译后可以直接使用。

Ctrl+A Ctrl+N 依次切换不同显示格式, 也可以在启动时直接指定, 例如

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

参考

    https://kaisenlinux.org/manpages/picocom.html

编程笔记 » Ubuntu下串口工具 PicoCOM 的使用和时间戳显示

赞同 (39) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽