linux系統下串列埠裝置和串列埠號繫結

2020-09-22 11:00:58

3.7 linux系統下串列埠裝置和串列埠號繫結

3.7.1 問題由來

​在ROS小車的開發過程中,需要使用ROS通訊串列埠模組、鐳射雷達的串列埠模組、IMU的串列埠模組等,為了防止每次開機這些裝置的串列埠號發生變動,所以需要對串列埠號與串列埠裝置繫結;為了更好的識別串列埠,我們也可以對串列埠號進行設定靜態名稱;為了更好的使用串列埠,我們也可以對串列埠進行許可權設定。

一次設定,終身受益。

3.7.2 原理

在linux系統下,雖然每一個固定的埠可能由於外接裝置啟動的時間差異分配的ttyUSB*不同,但是對於每一個固定的埠,都有固定的 KERNELS、idProduct、idVendor,並且每一個埠的KERNELS都不相同。

所以,我們只要固定串列埠裝置的安裝位置,還是可以從埠物理性質的不同解決這個問題。

3.7.3 方法

第一步:如何查詢每一個埠的KERNELS、idProduct、idVendor?

這裡需要使用下面這條命令

udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)

並且當每次獨立插入一個串列埠裝置時,串列埠號總為/dev/ttyUSB0,若不放心,可以使用下面命令查詢

ls /dev | grep ttyUSB

使用第一條命令,視窗將列印一堆裝置資訊,我們只需要KERNELS、idProduct、idVendor,我們向下滑找到類似下圖的部分找到該埠的資訊。

image-20200920220927095

注意查詢埠資訊時,請單獨插入串列埠裝置。

第二步:在/etc/udev/rules.d/目錄下建立自己的99-*.rules檔案

比如這裡建立99-robot-usb.rules檔案,使用如下命令

sudo vim /etc/udev/rules.d/99-robot-usb.rules

填入如下內容,儲存,根據自己裝置的資訊填寫

KERNELS=="3-2", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="robot",MODE:="0777"

對上述的解釋

==」:比較鍵、值,若等於,則該條件滿足;
「+=」:為一個表示多個條目的鍵賦值。
「:=」:對一個鍵賦值,並拒絕之後所有對該鍵的改動。目的是防止後面的規則檔案對該鍵賦值。
第三步:重新啟動並檢視設定是否生效

重新啟動

sudo reboot

等待開機,檢視埠

ll /dev | grep ttyUSB

中斷列印出如下資訊,設定成功

lrwxrwxrwx   1 root root           7 Sep 20 22:30 robot -> ttyUSB0
crwxrwxrwx   1 root dialout 188,   0 Sep 20 22:30 ttyUSB0

之後我們再使用該物理位置的埠時,它的串列埠號就固定為 /dev/robot,並且具有可讀可寫可執行的許可權。

注意事項:

以上只是對一個埠設定的流程,大家在多數情況下都是多個裝置。聰明的你,一定知道怎麼舉一反三。

每次獨立插入一個串列埠裝置,獲得它的KERNELS、idProduct、idVendor值,記錄下來;在/etc/udev/rules.d/目錄下建立自己的99-*.rules檔案,一次性填入這些裝置的資訊以及你需要的對映的名字;然後重新啟動即可。

以往連結,點選存取。

上一篇搭建ROS小車編寫啟動功能包
下一篇ROS機器人開機自啟動設定
系列文章從零搭建ROS機器人

如果你感覺,我的文章比較適合你,關注我,點個贊,給你不一樣的驚喜。

稿定設計匯出-20200810-205521
在這裡插入圖片描述