Files
blog-tech/content/posts/210311-SerialModeandUDEVinLinux.md
2026-07-17 10:20:54 +08:00

101 lines
5.3 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: Linux串口和udev理解
date: 2021-03-11T00:00:00+08:00
lastmod: 2021-03-11T00:00:00+08:00
draft: false
description: ''
authors:
- Kushidou
tags:
- Linux
- 串口
categories: []
toc: true
comments: true
---
配置串口权限,顺便看一下linux的udev规则。
<!--more-->
## 串口的问题
在现场开发的同事反映UOS工控机没有配置串口,每次都需要sudo才能使用。(明明在家里你们都会自己配置好环境与权限,为什么到了现场反而不会了需要我提供协助呢?)
我之前没考虑过这个问题,认为串口就是得root权限操作才安全。但是既然提出了需求,就赶紧百度并测试一下吧。
## 赋予普通用户串口权限的两种方法
在百度上,给普通用户串口权限有两种主流方法(可能2会了,Google上不去),一种是将用户放入特殊的用户组,从而获得权限。另一种是加入udev规则,在串口插入时自动更改权限。
我个人更倾向于使用第二种方案,因为公司中不同的人装系统就可能起不同的名字,之后进入生产环境可能又会起新的名字,所以采用第二种设置规则的办法,便于之后制作恢复镜像和一键部署。
## xxx.rules
`sudo vi /etc/udev/rules.d/70-tty-usb-rules`,写入以下内容:
```shell
KERNEL=="ttyS*",MODE="0666"
KERNEL=="ttyUSB*",MODE="0666"
```
这一段的意思是匹配所有ttyS和ttyUSB,插入时都赋予0666的权限,即所有用户都可读可写。重新加载一下设备,就可以按规则配置权限进行操作了。
## udev规则
udev是什么?udev是Linux下的设备文件管理方式,运行在用户侧(devfs在内核侧管理设备文件)。有了udev,`/dev`目录下的文件就都是真实存在的已连接的设备了。
udev的规则都保存在`/etc/udev/rules.d`目录下,文件名的格式为`数字-名称.rules`,数字表示加载顺序,一般是从小往大加载;名称按功能自定义,最后以.rules结尾。这些规则会在设备接入时生效。
规则文件按行执行,每行分为两个部分:匹配和赋值,每个参数使用逗号,分割。
> (这段复制自引用2,仅供参考)。
> **1、udev 规则的所有操作符**
> **==**  比较键、值,若等于,则该条件满足;
> **!=**  比较键、值,若不等于,则该条件满足;
> **=**   对一个键赋值;
> **+=**  为一个表示多个条目的键赋值。
> **:=**  对一个键赋值,并拒绝之后所有对该键的改动,防止后面的规则文件对该键重赋值。
>
> **2、udev 规则的匹配键**
> **ACTION**        事件 (uevent) 的行为,例如:add、remove。
> **KERNEL**         内核设备名称,例如:sda, cdrom。
> **DEVPATH**        设备的 devpath 路径。
> **SUBSYSTEM**       设备的子系统名称,例如:sda 的子系统为 block。
> **BUS**           设备在 devpath 里的总线名称,例如:usb。
> **DRIVER**         设备在 devpath 里的设备驱动名称,例如:ide-cdrom。
> **ID**            设备在 devpath 里的识别号。
> **SYSFS{filename}**    设备的 devpath 路径下,设备的属性文件“filename”里的内容。
> **ENV{key}**       环境变量。在一条规则中,可以设定最多五条环境变量的 匹配键。
> **PROGRAM**        调用外部命令。
> **RESULT**         外部命令 PROGRAM 的返回结果。
>
> **3、udev 的重要赋值键**
> **NAME**           /dev目录下显示的文件名重命名
> **SYMLINK**          为 /dev下文件进行符号链接,防止覆盖系统默认产生的文件
> **OWNER, GROUP, MODE**  为设备设定权限。
> **ENV{key}**         导入一个环境变量。
>
> **4、udev 的值和可调用的替换操作符**
> Linux 用户可以随意地定制 udev 规则文件的值。例如:my_root_disk, my_printer。同时也可以引用下面的替换操作符:
> **$kernel, %k**        设备的内核设备名称,例如:sda、cdrom。
> **$number, %n**        设备的内核号码,例如:sda3 的内核号码是 3。
> **$devpath, %p**       设备的 devpath路径。
> **$id, %b**          设备在 devpath里的 ID 号。
> **$sysfs{file}, %s{file}**   设备的 sysfs里 file 的内容。其实就是设备的属性值。
> **$env{key}, %E{key}**   一个环境变量的值。
> **$major, %M**        设备的 major 号。
> **$minor %m**        设备的 minor 号。
> **$result, %c**        PROGRAM 返回的结果。
> **$parent, %P**       父设备的设备文件名。
> **$root, %r**         udev_root的值,默认是 /dev/。
> **$tempnode, %N**      临时设备名。
> **%%**            符号 % 本身。
> **\$\$**             符号 $ 本身。
## 参考
[1]https://www.cnblogs.com/qixianyu/p/6869744.html
[2]https://www.cnblogs.com/cslunatic/p/3171837.html