現在我們的樹莓派需要連接激光傳感器測量室內的空氣質量。
買回來之後發現是通過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)