醬是創客的樹莓派教學主題第4篇,以Raspberry Pi開發板來實作教學,本篇教學將著重Raspberry Pi外接USB轉RS485 Serial並使用python 的pySerial接收/發送byte實作,常見的應用就是樹莓派來當Modbus Master透過RTU抓Slave的資料
設備:
Raspberry Pi 各系列
樹莓派4B #露天拍賣 #蝦皮購物
PYC U485B USB轉RS485 #露天拍賣 #蝦皮購物
接線方式:
樹莓派–USB–PYC U485B(USB轉RS485)
PYC U485B(USB轉RS485)–A線–A線–自行撰寫的RS485設備
PYC U485B(USB轉RS485)–B線–B線–自行撰寫的RS485設備
(115200,N,8,1)
首先要先準備一台裝好的樹莓派,並安裝好Raspbian,預設的Raspbian已經安裝好python了,再來我們先更新系統到最新版本,並安裝python的pyserial套件
1 2 3 | sudo apt-get update sudo apt-get upgrade pip install pyserial |
接著我們安裝PYC U485B的驅動程式,到他的官網下載驅動程式,裡面並附有如何在Linux安裝驅動程式的說明。我們也有發現最新的樹莓派版本已經有支援該款晶片,如果插入後沒有出現,有CH340的相關資料,再去官網下載安裝,我們輸入lsusb以後就可以找到USB Serial相關資訊,代表有成功抓到
1 2 3 4 | root@raspberrypi_chosemaker:/home/pi# lsusb Bus 003 Device 001 : ID 1d6b: 0002 Linux Foundation 2.0 root hub Bus 002 Device 001 : ID 1d6b: 0003 Linux Foundation 3.0 root hub Bus 001 Device 003 : ID 1a86: 7523 340 USB-Serial adapter |
我們要去debug message下面抓該張USB Serial使用哪一個tty,所以打dmesg | grep tty,這時候可以看到它使用ttyUSB0,它的Port名是/dev/ttyUSB0
1 2 | root@raspberrypi_chosemaker:/home/pi# dmesg | grep tty [ 12708.761510 ] usb 1 - 1.3 : ch341-uart converter now attached to ttyUSB0 |
開始來寫Python的程式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | import serial, time ser = serial.Serial() ser.port = "/dev/ttyUSB0" #115200,N,8,1 ser.baudrate = 115200 ser.bytesize = serial.EIGHTBITS #number of bits per bytes ser.parity = serial.PARITY_NONE #set parity check ser.stopbits = serial.STOPBITS_ONE #number of stop bits ser.timeout = 0.5 #non-block read 0.5s ser.writeTimeout = 0.5 #timeout for write 0.5s ser.xonxoff = False #disable software flow control ser.rtscts = False #disable hardware (RTS/CTS) flow control ser.dsrdtr = False #disable hardware (DSR/DTR) flow control try : ser. open () except Exception as ex: print ( "open serial port error " + str (ex)) exit() if ser.isOpen(): try : ser.flushInput() #flush input buffer ser.flushOutput() #flush output buffer #write 8 byte data ser.write([ 78 , 78 , 78 , 78 , 78 , 78 , 78 , 78 ]) print ( "write 8 byte data: 78, 78, 78, 78, 78, 78, 78, 78" ) time.sleep( 0.5 ) #wait 0.5s #read 8 byte data response = ser.read( 8 ) print ( "read 8 byte data:" ) print (response) ser.close() except Exception as e1: print ( "communicating error " + str (e1)) else : print ( "open serial port error" ) |
自行撰寫的RS485設備收到樹莓派發的8 byte 0x78後,會回發一個8 byte裡面是可以直接顯示8個string “N”。建立一個new.py並放在/home/pi,執行python3 new.py就可以跑出以下
1 2 3 4 | root@raspberrypi_chosemaker:/home/pi# python3 new .py write 8 byte data: 78 , 78 , 78 , 78 , 78 , 78 , 78 , 78 read 8 byte data: b 'NNNNNNNN' |