@toc
操作串口出现权限不足情况处理
sudo usermod -aG dialout 用户名 #把此用户名加入dialout用户组,可无需sudo操作串口
要查看某个串口的波特率等信息
可在控制台输入
stty -F /dev/ttyS0 -a #ttyS0为要查看的串口
也可以用stty设置串口参数
stty -F /dev/ttyS0 ispeed 115200 ospeed 115200 cs8
- 该命令将串口1(/dev/ttyS0)设置成115200波特率,8位数据模式。一般情况下设置这两个参数就可以了,如果显示数据乱码,可能还需要设置其它参数,使用man查看stty其它设置选项。
cat打印串口数据
使用后相当于串口回传,发什么回什么
cat /dev/ttyS0
发送数据
echo "xxx" > /dev/ttyS2
排查问题常用方法
1、查看串口是否可用
可以对串口发送数据比如对com1口
echo "x" /dev/ttyS0
2、查看串口名称使用
ls -l /dev/ttyS*
一般情况下串口的名称全部在dev下面,如果你没有外插串口卡的话默认是dev下的ttyS* ,一般ttyS0对应com1,ttyS1对应com2,当然也不一定是必然的;
3、查看串口驱动
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.
当一个串行卡或数据卡被侦测到时,它会被指定成为第一个可用的串行设备。通常是/dev/ttyS1(cua1)或/dev/ttyS2(cua2),这完成看原已内建的串口数目。ttyS*设备会被报告在/var/run/stab内。
PC上的串口一般是ttyS,板子上Linux的串口一般叫做ttySAC
6、写的串口程序不能正常接收发送数据
可能是linux下的串口设备没有打开,需要改变串口设备
的权限,或者根据文章头添加用户到组处理
chmod 777 /dev/ttyUSB0
串口号绑定
可以通过以下命令 查看 板子上的硬件端口的内核设备名
udevadm info --attribute-walk --name=/dev/ttyUSB0
该条命令会将 ttyUSB0所对应的硬件端口的kernel设备名 显现出来, 得到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 #如果存在,则需删除之,然后重新创建之
echo "/dev/ttydata is exist"
sudo rm /dev/ttydata
fi
./getUSB.py
调用当前路径下的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设备,并读取内容
www = open("./usbdev","wb") #当前路径下创建usbdev文件,后续会写入内容
s_read = sss.read() usb3/3-1/3-1.1/
r = r"usb3/3-1/3-1\.1.+(ttyUSB[0-9])"
#正则中“.”需要转义,所以使用“\.”表示“.”
#这个规则是找到usb3/3-1/3-1.1/这个字符串后面紧跟的是此次上电生成的ttyUSB0或者ttyUSB1
output = re.findall(r,s_read)
www.write(output[0]) #将结果写到usbdev中
www.close()
sss.close()
完成之后 ,设置开机启动cmd.sh(在/etc/rc.local中设置)则每次开机之后,会从/dev/ttydata获取到固定端口的数据
绑定硬件序列号,查找serial(适用于相同生产商生产的相同USB串口)
方式一
lsusb #查看自己的USB串口ID。我的USB串口是0403:6001
#编辑规则文件
vim /etc/udev/rules.d/myusb.rules #这里注意加s
写入内容如下:
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的驱动程序名
SUBSYSTEM: - 匹配子系统名。
ID :- 匹配总路系统的ID (e.g. PCI bus ID)。
PLACE :- 匹配物理位置 (对USB很有用)