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

这篇具有很好参考价值的文章主要介绍了Ubuntu下串口工具 PicoCOM 的使用和时间戳显示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

PICOCOM

Ubuntu下的串口软件, 除了 CuteCOM, screen, MiniCOM 以外, 还有一个和 MiniCOM 很像的 PicoCOM. 最近在调试 CH340C 串口的过程中, 发现只有 PicoCOM 的连接Reset才能正常工作, 因此单独记录一下.

  • 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

使用

连接和断开

使用 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 依次切换不同显示格式, 也可以在启动时直接指定, 例如文章来源地址https://www.toymoban.com/news/detail-444205.html

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

参考

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

到了这里,关于Ubuntu下串口工具 PicoCOM 的使用和时间戳显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【笔记】6位数码管显示定时器定时的时分秒,通过按键控制时间,自定义串口通信协议,根据单片机接收到的指令控制数码管显示

              目的:利用PROTUES仿真软件、串口调试助手、虚拟串口,搭建单片机与PC通信仿真平台,熟悉单片机串口的配置及与PC机的通信方法;尝试制定通信协议(含开始码、指令、数据、停止码),单片机根据通信协议解析接收到的内容,并根据接收的指令执行相应的操

    2024年02月05日
    浏览(52)
  • STM32使用HAL库,串口收发一段时间后出错问题及解决

    当STM32使用HAL库进行开发时,偶尔会遇到串口收发数据量大时,会出现问题。比如同时串口同时收发,一段时间后就只能发送,接收不工作。或是只接收,但数据量大时也不工作。下面对这些问题和其解决办法进行整理。 当数据量过大且传输频率快时,串口可能会因为溢出,

    2024年02月16日
    浏览(40)
  • Putty串口工具使用

    本文主要介绍Putty在windows平台和linux平台(redhat及centos)如何下载、安装,以及做为串口工具使用时的注意事项。 1.1.1 下载 下载网址: https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html 下载版本(根据操作系统选择32/64位版本):64-bit x86: putty-64bit-0.78-installer.msi 1.1.2 安装 双击

    2024年02月04日
    浏览(27)
  • STM32数据可视化显示——纸飞机串口调试助手的使用

    本人在开发STM32的过程中,数据都是通过XCOM串口调试助手进行展示的,但这样的话,数据就做不到图像化、多样化处理的显示,使得一些连续的数据无法通过图像来直观表达 感兴趣的朋友可以点进链接进行下载哦 http://blog.comassistant.cn/ 上图所示,为纸飞机调试助手的界面,可

    2023年04月12日
    浏览(49)
  • 串口debug工具使用方法

    串口debug使用方法   一、硬件连接方式 (1)USB A to B线,连接PC和debug小板。 (2)HDMI线,连接debug小板和TV HDMI串口。 注意:不需要VGA线及VGA-HDMI转接板。  二、使用方法 小板上有选择串口pin脚的拨动开关,看丝印选择。如不确定,可先往外拨。(I2C通信类似) (1)USB线插入

    2024年02月01日
    浏览(62)
  • 虚拟串口工具VSPD的使用

    上位机调试串口时,有时是没有硬件设备的,只能虚拟串口,这里简单的讲讲VSPD的使用VSPD是Virtual Serial Port Driver的简写,由著名的软件公司Eltima制作 下载VSPD,这里有个链接,大家也可以自行搜索下载 下载地址:https://www.cr173.com/soft/21406.html 下载后安装运行,首先添加端口映

    2024年02月12日
    浏览(36)
  • 虚拟串口工具VSPD简单使用

    1、下载 资源下载 虚拟串口+串口调试工具 2、安装及破解 解压 vspd7.2.308.zip 后文件如下,点击 vspd.exe 安装(安装没啥技巧一直下一步就好了,不过需要记住安装地址),在安装完成之后 vspdctl.dll 覆盖至安装文件夹覆盖掉原有文件(破解) 3、创建虚拟串口 运行软件如下: 点击新增

    2024年02月16日
    浏览(41)
  • 解决Ubuntu22.04无法使用ch34x串口问题

    在去年RDC2022上很幸运抽中了纪念板 柿饼M7 。在此感谢RT-Thread!!!本文介绍了Ubuntu22.04下开发RT Smart遇到的无法使用ch34x串口问题。 Ubuntu22.04无法使用ch34x串口 使用 lsusb 命令可以看到有 Bus 001 Device 005: ID 1a86:7523 QinHeng Electronics CH340 serial converter 是能识别出ch34x设备 Ubuntu22.04自带

    2024年02月01日
    浏览(37)
  • CRT串口工具使用方法2022.08.11

    CRT工具使用说明 一,安装SecureCRT工具, 然后安装串口驱动(可用驱动精灵) 二,将机器串口线和电脑串口板连接上。(机器开机状态) 三,查看电脑端设备管理器的串口com几(创建串口链接端口选择), 四,打开CRT,选快速连接(带闪电图标的按键), 1,协议(P)选择:

    2024年02月04日
    浏览(69)
  • 学习分享:Ubuntu 下使用 Qt 打开串口报错 Permission denied

    提前声明一下,开发环境是 Ubuntu18.04,用户是非 root 用户。 因项目需求,需要使用到 Qt 收发串口数据,曾经写过一个串口调试助手的程序 通俗易懂玩QT:串口调试助手制作(内附主要源代码) ,这里直接拷贝到 Ubuntu 虚拟机下使用,发现每次打开串口的时候都会发生错误,最开

    2024年02月11日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包