日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux下usb设备节点名不固定,解决Linux下USB设备节点ttyUSB名不固定的问题,生成固定USB转串口设备节点...

發(fā)布時(shí)間:2024/9/15 linux 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux下usb设备节点名不固定,解决Linux下USB设备节点ttyUSB名不固定的问题,生成固定USB转串口设备节点... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

解決Linux下USB設(shè)備節(jié)點(diǎn)ttyUSB名不固定的問題,生成固定USB轉(zhuǎn)串口設(shè)備節(jié)點(diǎn)

2018-09-19

http://blog.sina.com.cn/s/blog_8b58097f0102wxm3.htmlARM,STM32,FPGA,AD,PCB同行原創(chuàng)bloghttp://blog.sina.com.cn/s/articlelist_2337802623_0_1.html

1.Linux下USB設(shè)備節(jié)點(diǎn)名不固定問題經(jīng)常會遇到

以USB轉(zhuǎn)串口設(shè)備為例,通常設(shè)備節(jié)點(diǎn)名為ttyUSBx(x為0~n),Linux內(nèi)核會根據(jù)設(shè)備插入的先后順序進(jìn)行編號的分配,比如第一個(gè)插入的設(shè)備編號為ttyUSB0,然后依此加1,變?yōu)閠tyUSB1,ttyUSB2……

如果僅僅以設(shè)備節(jié)點(diǎn)ttyUSBx來區(qū)別具體是哪個(gè)設(shè)備,因?yàn)槟┪坏木幪柺请S時(shí)會變的,所以就會造成混亂。無法保證A設(shè)備就是ttyUSB0,B設(shè)備就是ttyUSB1。在設(shè)備文件/dev目錄下并沒有提供固定顯示ttyUSB的方法,但是,其實(shí),每個(gè)USB端口都有唯一的端口號,相當(dāng)于每個(gè)門店的門牌號。只要我們依據(jù)端口號來進(jìn)行設(shè)備的區(qū)分,那么問題就迎刃而解了。簡單點(diǎn)來說就是找到端口號,然后根據(jù)端口號找到掛載在這個(gè)端口號上面的USB設(shè)備是ttyUSB0還是ttyUSB1….(這個(gè)是變化的,前面講到了)。

2.關(guān)于端口號的查看方法,連接好兩個(gè)USB轉(zhuǎn)串口設(shè)備之后:

執(zhí)行命令:ls -l/sys/class/tty/ttyUSB*

lrwxrwxrwx root? ? root ?? ? ?? ? ?2017-08-0113:40 ttyUSB0 ->../../devices/ff540000.usb/usb3/3-1/3-1.1/3-1.1:1.0/ttyUSB0/tty/ttyUSB0

lrwxrwxrwx root? ? root ?? ? ?? ? ?2017-08-0113:43 ttyUSB1 ->../../devices/ff540000.usb/usb3/3-1/3-1.2/3-1.2:1.0/ttyUSB1/tty/ttyUSB1

可知:其中ttyUSB0所在的端口號為3-1.1,而ttyUSB1所在的端口號為3-1.2,可以看出,這里的3-1.1端口上比3-1.2上提前插上USB設(shè)備,所以會以這種方式命名。如果插入設(shè)備的順序相反,那么端口號3-1.1上對應(yīng)的設(shè)備應(yīng)該是ttyUSB1,而3-1.2上對應(yīng)的設(shè)備應(yīng)該是ttyUSB0。但是如果在實(shí)際過程中我們只需要采集端口3-1.1傳來的數(shù)據(jù),我們該如何通過ttyUSBx不定的設(shè)備節(jié)點(diǎn),獲取到固定端口的數(shù)據(jù)呢?

3.實(shí)際問題,實(shí)際解決:

實(shí)際工程中,碰到的一個(gè)問題是:硬件上連接有兩個(gè)USB轉(zhuǎn)串口設(shè)備,硬件只要一上電,兩個(gè)USB設(shè)備幾乎是同時(shí)上電的,這將導(dǎo)致ttyUSB0或者ttyUSB1無法每次固定的對應(yīng)到上一次的那個(gè)相同端口,上層軟件需要通過串口設(shè)備節(jié)點(diǎn)/dev/ttyUSBx來打開一個(gè)串口,并從串口獲取數(shù)據(jù),但是這個(gè)ttyUSBx設(shè)備并不是一直都指向固定的一個(gè)usb端口號,這直接導(dǎo)致我們無法往下操作了。

解決辦法:這里使用bash語言加Python正則表達(dá)式的相關(guān)知識解決這個(gè)問題:解決問題的思路是:

1. 第一次上電的時(shí)候,我們需要確定哪個(gè)端口上的數(shù)據(jù)是我們所需要的:

ls -l/sys/class/tty/ttyUSB*

假設(shè)是3-1.1這個(gè)端口是我們的data端口。

2.以后每次上電,我們要找到3-1.1這個(gè)端口后面掛載的ttyUSB設(shè)備是ttyUSB0還是ttyUSB1,并建立一個(gè)軟鏈接將當(dāng)時(shí)獲取到的ttyUSBx生成一個(gè)軟鏈接,名字固定為ttydata,那么以后每次打開/dev/ttydata就能找到正確3-1.1這個(gè)端口,并獲取數(shù)據(jù)了。

3.建立一個(gè)文件夾getUSB,該文件夾下面包含:

其中cmd.sh是利用bash腳本獲取/sys/class/tty/ttyUSB*的一些信息保存在device_usb.txt中

getUSB.py是通過device_usb.txt中的信息,獲取到當(dāng)前掛著在端口3-1.1上的是ttyUSB0還是ttyUSB1并保存在usbdev中

cmd.sh如下:

#!/bin/bash

declare -i a=0

declare -i b=0

while [[ ! -e "/sys/class/tty/ttyUSB0" ]]

do

sudo sleep 0.01s

a=a+1

if [ $a -eq 300 ];then?#等待一段時(shí)間沒有檢測ttyUSB0設(shè)備到會自動跳出while

break

fi

done

while [[ ! -e "/sys/class/tty/ttyUSB1" ]]

do

sudo sleep 0.01s

b=b+1

if [[ $b -eq 300||$a -ne 0 ]];then ?#if USB0been detected ,also get out of while

break

fi

done

if [[ ! -e /sys/class/tty/ttyUSB0&&! -e/sys/class/tty/ttyUSB1 ]]; then #如果不存在ttyUSB設(shè)備

echo "Not have ttyUSB0 or not have ttyUSB1"

else ? ? ?? ? ?? ? ?? ? ?? ? ?? ?#如果完美檢測到了兩個(gè)ttyUSB設(shè)備,則將信息log到device_usb.txt當(dāng)中

tty1=$(ls -l /sys/class/tty/ttyUSB0)

tty2=$(ls -l /sys/class/tty/ttyUSB1)

sudo ls -l /sys/class/tty/ttyUSB0 /sys/class/tty/ttyUSB1 >./device_usb.txt

fi

if [ ! -n "$tty1" ] ;then ? # "! -n" showsblank var ?#非空檢測

echo "tty1 is empty"

fi

#delay 0.01s to make sure the device_usb.txt complete

sudo sleep 0.01s

#remove the old USB device shortcut

if [ ! -e "/dev/ttydata" ] ;then # 如果/dev/ttydata本身不存在

echo "-------------/dev/ttydata not found"

else ? ? ?? ? ?? ? ?? ? ?? ? ?? ? ?#如果存在,則需刪除之,然后重新創(chuàng)建之

echo "/dev/ttydata is exist"

sudo rm /dev/ttydata

fi

#exct Python language to get the rignt USB interface

./getUSB.py ??#調(diào)用當(dāng)前路徑下的getUSB.py這個(gè)Python語言,明確此次是哪個(gè),ttyUSB0,或者ttyUSB1掛載在端口3-1.1上

usbdev=$(cat ./usbdev) #獲取到這個(gè)設(shè)備

echo "the device is : "

echo $usbdev

sudo ln -s /dev/$usbdev /dev/ttydata#將這個(gè)設(shè)備軟連接到/dev/ttydata以后每次打開這個(gè)ttydata即可

getUSB.py:

#!/usr/bin/python

#coding:utf-8

import re ?#正在表達(dá)式

sss = open("./device_usb.txt","rb")#打開device_usb.txt設(shè)備,并讀取內(nèi)容

www = open("./usbdev","wb")?#當(dāng)前路徑下創(chuàng)建usbdev文件,后續(xù)會寫入內(nèi)容

s_read = sss.read() ?usb3/3-1/3-1.1/

r = r"usb3/3-1/3-1\.1.+(ttyUSB[0-9])"

#正則中“.”需要轉(zhuǎn)義,所以使用“\.”表示“.”

#這個(gè)規(guī)則是找到usb3/3-1/3-1.1/這個(gè)字符串后面緊跟的是此次上電生成的ttyUSB0或者ttyUSB1

output = re.findall(r,s_read)

www.write(output[0]) #將結(jié)果寫到usbdev中

www.close()

sss.close()

完成之后設(shè)置開機(jī)項(xiàng)目,將文件夾當(dāng)?shù)酪粋€(gè)位置,然后設(shè)置開機(jī)啟動cmd.sh(在/etc/rc.local中設(shè)置)則每次開機(jī)之后,會從/dev/ttydata獲取到固定端口的數(shù)據(jù)

這兩天在ubuntu中開發(fā)跟串口有關(guān)程序時(shí),發(fā)現(xiàn)來回拔插串口線或者插多個(gè)串口線時(shí)總是出現(xiàn)串口號ttyUSB*不固定的問題,給應(yīng)用程序帶來不少麻煩,遂google解決。

linux中設(shè)備號一般按先后順序一次向后增大,udev規(guī)則文件可以解決這個(gè)蛋疼的問題。udev是一種Linux2.6內(nèi)核采用的/dev目錄的管理系統(tǒng)(可以把它認(rèn)為是windows中的設(shè)備管理器),它通過從sysfs獲得的信息,可以提供對特定設(shè)備的固定的設(shè)備名。sysfs是linux?2.6內(nèi)核的一種新型文件系統(tǒng),它提供了當(dāng)前設(shè)備的基本信息。

udev的重要功能就是為為設(shè)備提供固定的設(shè)備名, 根據(jù)Wirting udev rules的詳細(xì)介紹,udev有如下功能:

Rename a device node from the default name to something else

Provide an alternative/persistent name for a device node bycreating a symbolic link to the default device node

Name a device node based on the output of a program

Change permissions and ownership of a device node

Launch a script when a device node is created or deleted (typicallywhen a device is attached or unplugged)

Rename network interfaces

簡單閱讀之后創(chuàng)建文件/etc/udev/rules.d/10-local.rule,內(nèi)容如下

[html]?viewplain?copy

<span?style="white-space:pre">??span>KERNEL=="ttyUSB*",?ATTRS{idVendor}=="067b",?ATTRS{idProduct}=="2303",?MODE:="0777",?SYMLINK+="user_uart"

<span?style="white-space:pre">??span>KERNEL=="ttyUSB*",?ATTRS{idVendor}=="1a86",?ATTRS{idProduct}=="7523",?MODE:="0777",?SYMLINK+="mcu_uart"

意思就是匹配sys中內(nèi)核名為ttyUSB*的設(shè)備,屬性匹配依據(jù)生產(chǎn)商編號idVendor和產(chǎn)品號idProduct,設(shè)定讀寫權(quán)限為0777, 符號鏈接名為user_uart-----PL2303串口轉(zhuǎn)USB,mcu_uart----CH340串口轉(zhuǎn)USB。

idVendor和idProduct由 lsusb? -vvv命令查看。

保存退出后udev規(guī)則就生效了,重新拔插兩個(gè)串口設(shè)備,就可以看到/dev/user_uart指向/dev/ttyUSB0,?/dev/mcu_uart指向/dev/ttyUSB1.這樣以來,我只要在程序里打開/dev/user_uart或/dev/mcu_uart就可以一直準(zhǔn)確的打開指定的串口設(shè)備了。

PS:如果您的兩個(gè)串口用的都是PL2303或者都是CH340/CP2102,那就真的無能為力了。。。

常用的匹配類型:

* BUS:匹配總路類型,比如PCIUSB等

* KERNEL:- 匹配Kernel設(shè)備名,比如hdahdb.

* DRIVER :-匹配Kernel的驅(qū)動程序名

* SUBSYSTEM: -匹配子系統(tǒng)名。

* ID :- 匹配總路系統(tǒng)的ID (e.g. PCI busID)。

* PLACE :- 匹配物理位置?(對USB很有用)

資料鏈接:

http://www.cnblogs.com/ynxf/p/6379449.html

http://biancheng.dnbcw.net/linux/295328.html

免責(zé)聲明:本文僅代表文章作者的個(gè)人觀點(diǎn),與本站無關(guān)。其原創(chuàng)性、真實(shí)性以及文中陳述文字和內(nèi)容未經(jīng)本站證實(shí),對本文以及其中全部或者部分內(nèi)容文字的真實(shí)性、完整性和原創(chuàng)性本站不作任何保證或承諾,請讀者僅作參考,并自行核實(shí)相關(guān)內(nèi)容。

http://www.pinlue.com/style/images/nopic.gif

總結(jié)

以上是生活随笔為你收集整理的linux下usb设备节点名不固定,解决Linux下USB设备节点ttyUSB名不固定的问题,生成固定USB转串口设备节点...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。