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), <);
switch (opts.timestamp) {
case 3:
strftime(buff, sizeof(buff), "%Y-%m-%d %H:%M:%S", <);
sprintf(buff2, "%s.%03ld ", buff, tv.tv_usec / 1000);
write(STO, buff2, 24);
break;
case 2:
strftime(buff, sizeof(buff), "%H:%M:%S", <);
sprintf(buff2, "%s.%03ld ", buff, tv.tv_usec / 1000);
write(STO, buff2, 13);
break;
case 1:
strftime(buff, sizeof(buff), "%M:%S", <);
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
参考
Ubuntu下串口工具 PicoCOM 的使用和时间戳显示的更多相关文章
- Ubuntu下串口工具
一.Kermit 1.安装: sudo apt-get install ckermit 2.配置: sudo gedit /etc/kermit/kermrc 3.在文件末端添加如下内容 : set ...
- ubuntu下串口编程备忘
弄了一下串口,一个小问题多折腾了下,备忘.软件环境:zl@zhanglong:~$ cat /etc/lsb-release DISTRIB_ID=UbuntuDISTRIB_RELEASE=12.0 ...
- ubuntu 下截图工具的使用
我个人觉得,ubuntu自带的截图工具功能就不错.具体使用如下: 在ubuntu下的系统设置中找到硬盘区的“键盘”处,进入该设置界面如下: 选择标签“快捷键”,进入新设置界面如下所示: 之后,你就可以 ...
- UBUNTU下FPT工具--lftp使用说明
lftp 是UBUNTU下一个功能强大的下载工具,它支持访问文件的协议: ftp, ftps, http, https, hftp, fish.(其中ftps 和https需要在编译的时候包含open ...
- 转:Ubuntu下下载工具安装--uget+aria2
原文地址:http://burner1024.blog.163.com/blog/static/17447800420126191858424/ Windows下的下载工具--迅雷,之所以下载速度快, ...
- Ubuntu 下串口调试工具
1. cutecom 安装:sudo apt-get install cutecom 打开方式: 在终端输入:cutecom,即可打开串口工具 或者在应用中,点击 cutecom 图标打开 打开后的界 ...
- ubuntu下截图工具推荐 -- [deepin-scrot]
有时候我们需要在linux下截图来保存.如果你仅仅需要全屏截图的话其实可以直接按键盘上的PrScrn或者Press Print键盘按键来实现即可: 但是如果你需要对截图的图片进行标记.画个线画个圈加个 ...
- ubuntu 下串口调试工具 minicom安装与配置cutecom安装
安装minicom: $sudo apt-get install minicom 配置minicom: 如果您的系统的默认语言不是英文,请执行下面的命令: $LANG=EN ...
- linux下串口工具minicom
系统环境:ubuntu 14 .04 和ubuntu 16.04 我当时的需要主要是两个,能够看到正常串口输出,并且把串口内容实时输出到文件中 那接下来工作主要是两个:1.安装 2.配置 相信各位 ...
- ubuntu 下串口调试工具 minicom安装与配置
检查系统是否支持USB转串口: lsmod | grep usbserial 如果有usbserial,说明系统支持USB转串口. 识别串口设备: 插上USB转串口,在终端输入命令: #dmesg | ...
随机推荐
- zip文件自动打包
简单的文件打包 首先是问题 我们有一个文件的文件过大,我需要删除或者压缩,当然我们就是选择压缩 如果是单个我们可以直接使用压缩功能 但是多个呢? 首先获取当前目录下的文件,使用 a=`ls` | te ...
- iframe跨域通信window.postMessage()方法
需求:A页面中要嵌入一个iframe,这个iframe是B页面,此时A页面需要得到B页面的一些信息. window.postMessage() 我们都知道浏览器的同源策略,即对于两个不同页面的脚本,只 ...
- Android笔记--案例:找回密码
找回密码 具体实现: 登录成功: 报告密码不同: 报告验证码错误: 代码相关: 找回密码的界面很简单,不细说了,直接写就行 找回密码的逻辑实现: 下一次就去写数据存储啦! 拜拜!
- 关于再次报错500--Servlet报出异常
我是根据这样的方法解决的: 本来在前几篇里面,我是将get或者post的没有用到的方法里面自带的super方法直接删除了的,然后今天运行发现,功能实现不了,还报出500的异常错误: 心态直接裂开,然后 ...
- MySQL学习(七)varchar和char区别
varchar:用于存储可变长字符串,是最常见的字符串数据类型.比定长类型更节省空间,因为它仅使用必要的空间.varchar需要使用1或2个额外字节记录字符串的长度:如果列的最大长度小于或等于255字 ...
- Unity Joint用法及案例
目录 什么是Joint 有哪些Joint Joint计算原理 自由度配置 Axis与Anchor Limit与Spring Drive与Target Joint应用案例 车轮 旋转 悬挂系统 吊臂 旋 ...
- SpringBoot 整合 Avro 与 Kafka
更多内容,前往IT-BLOG [需求]:生产者发送数据至 kafka 序列化使用 Avro,消费者通过 Avro 进行反序列化,并将数据通过 MyBatisPlus 存入数据库. 一.环境介绍 [1] ...
- JVM 频繁 FULL GC 快速排查整理
在分享此案例前,先聊聊哪些场景会导致频繁Full GC: 内存泄漏(代码有问题,对象引用没及时释放,导致对象不能及时回收)死循环大对象程序执行了System.gc() 尤其是大对象,80%以上的情况就 ...
- 单元测试Mockito框架
单元测试Mockito框架 Mock 测试就是在测试过程中,对于某些 不容易构造(如 HttpServletRequest 必须在 Servlet 容器中才能构造出来)或者不容易获取 比较复杂 的对象 ...
- Node.js爬取百度图片瀑布流,使用class类封装。
//爬取百度高清图片 const phantom = require('phantom') const express = require('express'); const app = expres ...