@toc
操作串口出現(xiàn)權(quán)限不足情況處理
sudo usermod -aG dialout 用戶名 #把此用戶名加入dialout用戶組艘儒,可無需sudo操作串口
要查看某個串口的波特率等信息
可在控制臺輸入
stty -F /dev/ttyS0 -a #ttyS0為要查看的串口
也可以用stty設置串口參數(shù)
stty -F /dev/ttyS0 ispeed 115200 ospeed 115200 cs8
- 該命令將串口1(/dev/ttyS0)設置成115200波特率,8位數(shù)據(jù)模式。一般情況下設置這兩個參數(shù)就可以了懒浮,如果顯示數(shù)據(jù)亂碼捏萍,可能還需要設置其它參數(shù),使用man查看stty其它設置選項。
cat打印串口數(shù)據(jù)
使用后相當于串口回傳比规,發(fā)什么回什么
cat /dev/ttyS0
發(fā)送數(shù)據(jù)
echo "xxx" > /dev/ttyS2
排查問題常用方法
1吱窝、查看串口是否可用
可以對串口發(fā)送數(shù)據(jù)比如對com1口
echo "x" /dev/ttyS0
2讥邻、查看串口名稱使用
ls -l /dev/ttyS*
一般情況下串口的名稱全部在dev下面,如果你沒有外插串口卡的話默認是dev下的ttyS* ,一般ttyS0對應com1院峡,ttyS1對應com2兴使,當然也不一定是必然的;
3照激、查看串口驅(qū)動
cat /proc/tty/drivers/serial
4发魄、查看串口設備
dmesg | grep ttyS*
5、查一下板子上的串口有沒有設備
grep tty /proc/devices
如果有ttyS設備俩垃,再看/dev/有沒有ttyS*励幼,如沒有就建立一個:
mknod /dev/ttyS0 c 4 64
如果板子的設備中沒有標準串口設備ttyS0,也沒有ttySAC0口柳。/dev下應該有一個USB串口:/dev/ttyUSB0.
當一個串行卡或數(shù)據(jù)卡被偵測到時苹粟,它會被指定成為第一個可用的串行設備。通常是/dev/ttyS1(cua1)或/dev/ttyS2(cua2)跃闹,這完成看原已內(nèi)建的串口數(shù)目嵌削。ttyS*設備會被報告在/var/run/stab內(nèi)。
PC上的串口一般是ttyS,板子上Linux的串口一般叫做ttySAC
6、寫的串口程序不能正常接收發(fā)送數(shù)據(jù)
可能是linux下的串口設備沒有打開姜凄,需要改變串口設備
的權(quán)限,或者根據(jù)文章頭添加用戶到組處理
chmod 777 /dev/ttyUSB0
串口號綁定
可以通過以下命令 查看 板子上的硬件端口的內(nèi)核設備名
udevadm info --attribute-walk --name=/dev/ttyUSB0
該條命令會將 ttyUSB0所對應的硬件端口的kernel設備名 顯現(xiàn)出來艇劫, 得到KERNEL== '1-5.5.4', 而不是之前的ttyUSB0
cd /etc/udev/rules.d/
vim usb1.rules
ACTION=="add",ENV{ID_BUS}=="usb",ENV{ID_PATH_TAG}=="platform-1c1d000_usb-usb-0_1_1_1_0",SYMLINK+="ttyUSBPort1" #固定串口號
參考博客
腳本方式
- cmd.sh是利用bash腳本獲取/sys/class/tty/ttyUSB*的一些信息保存在device_usb.txt中
- getUSB.py是通過device_usb.txt中的信息惩激,獲取到當前掛著在端口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 #等待一段時間沒有檢測ttyUSB0設備到會自動跳出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 USB0 been detected ,also get out of while
break
fi
done
if [[ ! -e /sys/class/tty/ttyUSB0&&! -e /sys/class/tty/ttyUSB1 ]]; then #如果不存在ttyUSB設備
echo "Not have ttyUSB0 or not have ttyUSB1"
else #如果完美檢測到了兩個ttyUSB設備店煞,則將信息log到device_usb.txt當中
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" shows blank 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
./getUSB.py
調(diào)用當前路徑下的getUSB.py這個Python語言浅缸,明確此次是哪個,ttyUSB0,或者ttyUSB1掛載在端口3-1.1上
usbdev=$(cat ./usbdev) #獲取到這個設備
echo "the device is : "
echo $usbdev
sudo ln -s /dev/$usbdev /dev/ttydata #將這個設備軟連接到/dev/ttydata以后每次打開這個ttydata即可
getUSB.py:
#!/usr/bin/python
#coding:utf-8
import re #正在表達式
sss = open("./device_usb.txt","rb") #打開device_usb.txt設備轨帜,并讀取內(nèi)容
www = open("./usbdev","wb") #當前路徑下創(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)義衩椒,所以使用“\.”表示“.”
#這個規(guī)則是找到usb3/3-1/3-1.1/這個字符串后面緊跟的是此次上電生成的ttyUSB0或者ttyUSB1
output = re.findall(r,s_read)
www.write(output[0]) #將結(jié)果寫到usbdev中
www.close()
sss.close()
完成之后 蚌父,設置開機啟動cmd.sh(在/etc/rc.local中設置)則每次開機之后,會從/dev/ttydata獲取到固定端口的數(shù)據(jù)
綁定硬件序列號毛萌,查找serial(適用于相同生產(chǎn)商生產(chǎn)的相同USB串口)
方式一
lsusb #查看自己的USB串口ID苟弛。我的USB串口是0403:6001
#編輯規(guī)則文件
vim /etc/udev/rules.d/myusb.rules #這里注意加s
寫入內(nèi)容如下:
KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0666", GROUP:="dialout", SYMLINK+="485_serial" #CP210X
ls -l /dev |grep ttyUSB
方式二
udevadm info --attribute-walk --name=/dev/ttyUSB0
我的硬件序列號:ATTRS{serial}=="FTSYWCXZ"這個號是唯一的
vim /etc/udev/rules.d/usb.rules
ATTRS{serial}=="FTSYWCXZ", MODE:="0777", GROUP:="dialout", SYMLINK+="usb_0"
ls -l /dev |grep ttyUSB
可以通過/dev/usb_0打開串口設備
常用的匹配類型:
BUS:匹配總路類型,比如PCI USB等
KERNEL:- 匹配Kernel設備名阁将,比如hda hdb.
DRIVER :- 匹配Kernel的驅(qū)動程序名
SUBSYSTEM: - 匹配子系統(tǒng)名膏秫。
ID :- 匹配總路系統(tǒng)的ID (e.g. PCI bus ID)。
PLACE :- 匹配物理位置 (對USB很有用)