Basic
对于linux下的串口设备文件,(通常为 /dev/ttyUSB*
,/dev/ttyACM*
,/dev/ttyS*
或其他设备自定义名称设备文件), 一般可以通过拔插串口设备并配合dmesg
查看内核最后的信息,来确定最近接入的串口设备对应哪个或哪几个设备文件。
在linux发行版中常见的可用于串口交互的工具如 minicom
,putty
。这里主要记录minicom
工具,putty
工具是图形化界面 的程序,使用较简单,sudo apt install putty
安装后,运行后使用”serial”模式,即为串口模式。
安装和使用
minicom工具的安装同样类似 sudo apt install minicom
。也有man page手册,不过一般不需要查看。 minicom工具本身不需要root权限,但是它需要打开串口设备文件,一般还是需要root权限来运行的,或者对串口设备文件添加相关权限也可行。
一些tips
常规使用方式
运行 (尤其是首次运行)
1
sudo minicom -s
即进入minicom配置,随后在文本交互页面中选择 -> Serial port setup
,之后选择相应的串口设备文件和波特率等,另外,根据实际情况开关软硬件流控。
有时遇到minicom无法输入的问题,如果不是设置不对,很可能就是没有关闭流控,现在的串口基本不会使用流控,但minicom默认是打开硬件流控的!! 所以确认关闭,通常就能输入了
设置完毕后,可以进一步保存设置,选择 -> Save setup as dfl
。
之后选择退出设置,进入串口交互。
控制面板
运行中呼出控制面板,英文输入法下,先press CTRL-A
,再按 Z
。常用功能包括:
- 退出minicom :
X
- 开启和关闭时间戳 :
M
- 开启和关闭日志捕获 :
L
- 回滚查看上文 :
B
- 清屏 :
C
记住字母对应功能后,可以直接键入 CTRL-A , X
就是直接退出了,其他同理。
权限问题
由于设备文件的权限通常为 0660 ,一般用于对应others,是没有读写权限的。串口设备文件也是如此。正是因为该情况,所以minicom通常使用sudo
运行。
也可以对串口设备文件加上 0006 权限,但不太方便,建议还是直接使用sudo运行minicom。
此外,还可以使用 udev 工具,自动为相关设备文件设置指定权限,也可以解决: 编辑文件/etc/udev/rules.d/70-ttyusb.rules
,添加如下内容即可。
1
KERNEL=="ttyUSB[0-9]*", MODE="0666"
之后,系统中创建ttyUSB
设备文件时,会为其设置0666权限。
命令行参数
minicom在启动时,除了基本的 -s
参数,(-s表示进入minicom交互式设置),还有其他参数,命令行参数优先级更高,使用时会override配置文件中的参数。 单次使用更方便,如:
-D, --device
: 指定设备文件,如 -D /dev/ttyUSB1-C, --capturefile=FILE
: 打开抓取日志,并记录到 FILE 对应的文件中-H, --displayhex
: hex 输出模式,有时调二进制相关的可以使用
简化操作
由于linux的设备文件,命名是动态后缀。根据系统中已分配的同类设备号情况,新接入的串口设备文件名也不同,所以需要用户自己看一下内核信息,拔插一下,看看 dmesg -w
的打印,确定新接入的串口设备对应哪个设备文件。一般是 ttyUSB*
,有的会出现ttyACM*
,ttyS
等,有时还会是其他的自定义的名字。
使用时,可以写个shell函数,方便自己选择,而不是手写。参考:
alias方式
较简单,定义在 ~/.bashrc
中。场景:根据ttyUSB后缀数字打开对应串口。另外,由于其他同事也需要时常打开串口串口信息, 但一直不关闭,因为是相同的串口,就要先帮他关闭,再重新打开了,被kill的minicom终端需要reset一下。以下方式会kill所有 minicom程序如果需要指定kill需要的单个,需要修改pid检索方式,可以使用grep配合awk实现。
1
2
# 简化minicom输入,强制关闭已存在串口,并显示可用的串口
alias minicom='sudo bash -c "{ ls /dev/ttyUSB* ; echo -n choose ttyUSB No: ; read TTYUSBNO ;echo \"select /dev/ttyUSB\$TTYUSBNO\"; kill -n 9 `ps -C minicom -o pid=` ; /usr/bin/minicom -D /dev/ttyUSB\$TTYUSBNO;}"'
函数方式
更容易编写,同样定义在~/.bashrc
,定义为一个shell函数。~/.bashrc
文件本身是一个会被source的脚本文件,可以直接在里面定义函数,编写更方便。
来着网络参考,补充了日志文件的基于时间记录。根据需要修改即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
com() {
ports_USB=$(ls /dev/ttyUSB*)
ports_ACM=$(ls /dev/ttyACM*) #arduino
# or others
ports="$ports_USB $ports_ACM"
datename=$(date +%Y%m%d-%H%M%S)
select port in $ports;do
if [ "$port" ]; then
echo "You select the choice '$port'"
minicom -D "$port" -C /tmp/"$datename".log "$@"
break
else
echo "Invaild selection"
fi
done
}