现在我们的树莓派需要连接激光传感器测量室内的空气质量。
买回来之后发现是通过USB连接通过Modbus RTU 进行传输的。
然后网上查了下: python modbus 实现RTU 通信
测试了一下代码,发现怎么更改端口号都找不到设备,查了一下树莓派USB端口设置, 然后发现需要对USB串口进行固定: 树莓派USB端口绑定
首先多次插拔确定USB端口:
lsusb
sudo gedit /etc/udev/rules.d/99-com.rules
#文末添加
KERNEL=="ttyUSB*",ATTRS{idVendor}=="1a86",ATTRS{idProduct}=="7523", MODE:=“0777”, SYMLINK+="device0"
//然后重启 udev
sudo /etc/init.d/udev restart
然后重新插拔设备
ls /dev/device*
->/dev/device0
然后再测试之前的脚本,可以找到设备了。
但是每次都返回Invalid CRC in response. 估计是自带的校验码有什么鬼毛病,没办法查错。。然后换了种方式:
如何使用树莓派测定颗粒物(PM 2.5)
发现他们家的代码仅支持Python2.7以下的版本,python3跑的时候什么都不返回。
测试分析后发现在于python3对返回方式的处理不同,更改代码如下可以正常读取数据:
import serial, time
ser = serial.Serial()
ser.port = "/dev/device0"
ser.baudrate = 9600
ser.open()
ser.flushInput()
while True:
ser.write("AAB4FE010300000000000000000000FFFF00AB".encode())
byte = -1
while byte != b'\xaa':
byte = ser.read(size=1)
d = ser.read(size=9)
if d[0] == 192:
pm_25 = (d[1] + 256*d[2]) / 10.0
pm_10 = (d[3] + 256*d[4]) / 10.0
print("Current pm2.5: ", pm_25, " pm10: ", pm_10)
else:
print("Not a correct request for PM reading.")
time.sleep(1)