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 | ...
随机推荐
- docker 学习之一 装MySQL 供远程使用 Linux
因为Linux发行版本的问题折腾了好久,尽量使用LTS的版本.其他版本有时候缺的东西太多了,对新手相当不友好. 大概花了几天实在没招了,下了个LTS的版本,再装时正常了.按照官方文档都可以搞定了. 使 ...
- kali更新源数字签名错误解决办法
apt-get update更新时出现错误,提示Release文件已经过期,无论是使用kali官方源还是阿里源.中科大源都报该错误. 网上查找相关资料,签名出错需要下载数字签名,方案如下: wget ...
- Android笔记--数据存储之SharedPreferences
SharedPreferences--轻量级存储工具(共享参数) 其采用的存储结构是Key-Value的键值对方式 SharedPreferences用法以及相关的简单案例 记住密码的实现 实现啦! ...
- mybatis-spring注解MapperScan的原理
很多开发者应该都知道,我们只使用@MapperScan这个注解就可以把我们写的Mybatis的Mapper接口加载到Spring的容器中,不需要对每个Mapper接口加@Mapper这个注解了,加快了 ...
- Java面试——RPC
一.RPC 服务的原理 [1]Socket 套接字:网络上的两个程序通过一个双向的通信连接实现数据的交换,这个链接的一端称为 Socket.可以实现不同计算机之间的通信,是网络编程接口的具体实现.So ...
- offsetX与offsetLeft
offsetX:鼠标指针距离当前绑定元素左侧距离,他并不是相对于带有定位的父盒子的x,y坐标, 记住了,很多博客都解释错了 offsetLeft,offsetTop 相对于最近的祖先定位元素.
- 一遍博客带你上手Servlet
概念 Servlet其实就是Java提供的一门动态web资源开发技术.本质就是一个接口. 快速入门 创建web项目,导入servlet依赖坐标(注意依赖范围scope,是provided,只在编译和测 ...
- hta--Windows运行html的桌面应用程序(HTML应用程序)
HTA(HTML Application)-- HTML应用程序 作为前端开发,我们能熟练使用html实现各种效果,但是如果要实现一个简单的桌面应用程序那么应该怎么做呢,答案很简单,只需要把html文 ...
- 在Android应用中通过Chaquopy使用Python
在Android应用中通过Chaquopy使用Python [译] 通过Python脚本和包为Android应用带来更多的功能 翻译自https://proandroiddev.com/chaquop ...
- Django之form表单相关操作
目录 摘要 form表单 form表单的action参数 form表单的method参数 request.method方法 简介 get请求传递数据 post请求传递数据 GET/POST实际应用,简 ...