树莓派 激光pm2.5传感器模块SDS011 Modbus RTU

现在我们的树莓派需要连接激光传感器测量室内的空气质量。
买回来之后发现是通过USB连接通过Modbus RTU 进行传输的。
然后网上查了下: python modbus 实现RTU 通信
测试了一下代码,发现怎么更改端口号都找不到设备,查了一下树莓派USB端口设置, 然后发现需要对USB串口进行固定: 树莓派USB端口绑定
首先多次插拔确定USB端口:

lsusb

树莓派 激光pm2.5传感器模块SDS011 Modbus RTU_第1张图片

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)

你可能感兴趣的:(树莓派,Python)