首页 > 系统相关 >Ubuntu下串口工具 PicoCOM 的使用和时间戳显示

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

时间:2023-05-14 19:57:14浏览次数:54  
标签:RESET Ctrl tv 串口 PicoCOM Ubuntu picocom buff

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

参考

标签:RESET,Ctrl,tv,串口,PicoCOM,Ubuntu,picocom,buff
From: https://www.cnblogs.com/milton/p/17399974.html

相关文章

  • Qt_c++上位机2套串口实时曲线带平滑 1,设置串口. 2,串
    Qt_c++上位机2套串口实时曲线带平滑1,设置串口.2,串口收发数据。3,数据模拟。4,接收数据形成曲线。5,曲线控件的各种外观设置。6,可以设置平滑曲线。参数如下:-----------------------------1)编程语言:C++(11或以上);-----------------------------2)编程环境:QT5.14;-----------------......
  • c#非标自动化通讯库,工业自动软件必备的基本程序。 包括串口通信
    c#非标自动化通讯库,工业自动软件必备的基本程序。包括串口通信,TCP客户端,tcp服务器端,高并发物联网接收服务器端,udp通信,can总线通信,profinet,modbustcp/rtu/dtu等,各大品牌plc通信,opcua,opcda,http通信,mysql常规库,ef6+mysql,ef6+sqlite,firebird数据库,ini配置文件操作,excel表格操作(包括......
  • Ubuntu 22.04 停止显示 Daemons using outdated libraries
    这是Ubuntu22.04的新特性,现在是apt-get安装过程的一个步骤,是由needrestart命令触发,默认情况是交互性质的,也就是会中断在这里需要手动要处理提示。解决的方法是修改/etc/needrestart/needrestart.conf文件,将#$nrconf{restart}='i';这行去掉注释,按照需要改成以下两......
  • c#工业自动化通信开发库,工业自动软件必备的基本程序。 包括串口通信,TC
    c#工业自动化通信开发库,工业自动软件必备的基本程序。包括串口通信,TCP客户端,tcp服务器端,高并发物联网接收服务器端,udp通信,can总线通信,profinet,modbustcp/rtu/dtu等,各大品牌plc通信,opcua,opcda,http通信,mysql常规库,ef6+mysql,ef6+sqlite,firebird数据库,ini配置文件操作,excel表格操作......
  • 合宙esp32c3开发板多软串口及GPIO测试
    合宙esp32c3开发板共引出GPIO口如下:GPIO0~13,GPIO18~21并有如下提示:使用注意事项BOOT(IO09)管脚上电前不能下拉,ESP32会进入下载模式。使用到IO08管脚进行设计,不建议外部直接下拉,因为在下载烧录时,IO08管脚为低电平,不能使用串口进行下载。IO12(GPIO12)、IO13(GPIO13)在QIO模式......
  • 如何在虚拟机下的ubuntu制作磁盘阵列以及对几种磁盘阵列的解释
    一、磁盘阵列的分类raid0:一块硬盘及以上优点:数据读取快缺点:没有冗余能力,硬盘损坏,数据丢失raid1:至少两块硬盘优点:数据安全强,一块硬盘运行,另外一块硬盘做镜像备份数据。一块坏了,另外一块硬盘也有完整的数据,保障运行。缺点:做raid1之后硬盘使用率为50%.raid5:至少三块硬盘优点......
  • Ubuntu 20.04 实装我的世界 Paper 服务器
    0x01-环境需求一台能上网、有公网IP的服务器ssh客户端(可选,如果是云服务器则必须)Linux使用经验(可选)0x02-下载装好系统,先更新:sudoaptupdatesudoaptupgrade去PaperMC网站选好版本,点击下载,再用ftp传到服务器。0x03-首次启动因为核心是.jar文件......
  • Ubuntu 升级 git,如何应对sudo add-apt-repository ppa:git-core/ppa卡死的情况
    绕开代理https://blog.csdn.net/m0_68734901/article/details/128411072sudo-Eadd-apt-repositoryppa:git-core/ppasudoapt-getupdatesudoapt-getinstallgit......
  • 格式化Ubuntu系统后直接进入Grub
    问题描述:我的电脑装了Win10,Ubuntu18.04和Ubuntu20.04,在格式化Ubuntu18.04所在分区后,开机就进入Grub。分析:按F2进入BIOS,调整WindowsBootloader到第一位,Win10仍然能正常启动。若将Ubuntu置于顶端,则进入Grub。估计是因为Ubuntu的开机引导也被一并清理掉了,需要重设开......
  • Ubuntu20.04无法访问U 盘
    在Ubuntu系统下,正常我们插入U盘是可以识别并自动挂载的,例如:但是有时候我们发现插入U盘,系统居然无法识别,打开文件,那里没有显示。可以通过在一个新文件夹中挂载U盘地址的方式访问U盘。1、打开终端2、终端输入lsblk结果会输出许多设备信息,例如:此时我们发现设备中有一个sda(......