2014年12月19日 星期五

LINUX 插入USB執行某個script

系統:
Arch linux

需求:
重開機後/dev/ttyUSB[0-9] 的設定會跑掉,我的板子頻率要跑9600 8n1 才能溝通

手動設定指令:
# stty -F /dev/ttyUSB1 raw speed 9600 -crtscts cs8 -parenb -cstopb

重開機自動設定:
原本在這篇 arch 開機執行程式 想要用rc.local做,但是stty在rc.local我一直無法設定,印出來的內容是空的,所以改從udev的rules下手
新增檔案 /etc/udev/rules.d/usb.rules ,內容為:
ACTION=="add", KERNEL=="ttyUSB*", RUN+="/usr/bin/bash /your_script_path/set_stty.sh"
功用為:
在/dev/ttyUSBx插入時,會跑set_stty.sh這個程式。

根據 Arch 官方文件 https://wiki.archlinux.org/index.php/udev ,必須命名 .rules 的檔案,而/etc/udev/rules.d/ 和 /usr/lib/udev/rules.d/ (由其他packages自動產生的rules)有同樣名字的rules時,以 /etc/udev/ 下的優先

set_stty.sh內容:
#!/bin/sh
LOGFILE=/tmp/set_stty.log
exec 3>> $LOGFILE && exec >& 3 && exec 2>&1
echo $SEQNUM $SUBSYSTEM $ACTION $DEVNAME
if [ "$SUBSYSTEM" = "tty" -a "$ACTION" = "add" ]
then
    echo ""
    echo "=============================="
    date "+%G-%m-%dT%H:%M:%S %z"
    echo "$SUBSYSTEM $ACTION"
    stty -F $DEVNAME raw speed 9600 -crtscts cs8 -parenb -cstopb
fi
exit $?  # 結束這個 script 並把當時的執行結果傳回(return)給呼叫這個 script 的任何程式。想要省略掉的話,也沒什麼問題,然而我們必須平時就養成撰寫程式的正確習慣,在 UNIX 系統上,任何程式、函式都必須要有傳回值,就算是不知道有誰會去用它。我們不希望看到那一天,當有人突然去用它的時候,就必須面對噩運。這看似小事一件,然而缺乏持續性對小節的正確習慣或態度。 by 翔

$SEQNUM $SUBSYSTEM $ACTION $DEVNAME 這些是uevents ,可以幫助我們在script裡面判斷
例如插入一次接板子的usb,在log中可以看到set_stty.sh跑了兩次
ex.
echo $SEQNUM $SUBSYSTEM $ACTION $DEVNAME 這行印到/tmp/set_stty.log的內容:
2355 usb-serial add "(空)"
2356 tty add /dev/ttyUSB1

實測:
重開機後,呼叫串口的web api ,有正常返回值

參考資料:
http://king70327.blogspot.jp/2011/12/linux-centosusbscript.html

沒有留言:

張貼留言