---做者吳疆,未經容許,嚴禁轉載,違權必究---php
---歡迎指正,須要源碼和文件可站內私信聯繫---html
-----------點擊此處連接至博客園原文-----------python
功能說明:Python編程實現USB轉RS485串口通訊(發送數據、接收數據均爲16進制格式)linux
運行環境:Windows7&Python3.7與Ubuntu14.04&Python2.7,宇泰UT-890A USB轉RS-485/422串口鏈接線編程
文件下載:源碼點擊下載 vsl7 ubuntu
1、Windows7&Python3.7下Python編程實現USB轉RS485串口通訊spa
參考連接:USB轉串口鏈接線與串口調試助手的使用、用Python採集RS485溫溼度傳感器信息.net
(1)驅動下載3d
解壓驅動壓縮包,選取..\390-11000880 V01\Driver\win xp server2003 2008 2012 Vista 7 8 8.1 10 32-64bit\中Autoinstaller_WHQL_CDM2.12.24_Win 2K, XP, Vista, 7, 8, 8.1, 10, 32_64bit.exe傻瓜式安裝,可見USB轉串口鏈接線與串口調試助手的使用。調試
(2)環境搭建
安裝serial庫,cmd中執行命令 pip3 install pyserial
(3)源碼實現
# -*- coding:utf-8 -*- # Author: WUJiang # 運行環境爲Windows7&Python3.7 import serial import time ser = serial.Serial("com3", 9600) # 選擇串口,並設置波特率 if ser.is_open: print("port open success") # hex(16進制)轉換爲bytes(2進制),應注意Python3.7與Python2.7此處轉換的不一樣 send_data = bytes.fromhex('ff 01 00 55 00 00 56') # 發送數據轉換爲b'\xff\x01\x00U\x00\x00V' ser.write(send_data) # 發送命令 time.sleep(0.1) # 延時,不然len_return_data將返回0,此處易忽視!!! len_return_data = ser.inWaiting() # 獲取緩衝數據(接收數據)長度 if len_return_data: return_data = ser.read(len_return_data) # 讀取緩衝數據 # bytes(2進制)轉換爲hex(16進制),應注意Python3.7與Python2.7此處轉換的不一樣,並轉爲字符串後截取所需數據字段,再轉爲10進制 str_return_data = str(return_data.hex()) feedback_data = int(str_return_data[-6:-2], 16) print(feedback_data) else: print("port open failed")
2、Ubuntu14.04&Python2.7下Python編程實現USB轉RS485串口通訊
參考連接:‘serial’ object has no attribute 'is_open'報錯解決方法、
(1)驅動下載
按linux對應驅動安裝包中readme說明直接make報錯,解決不了尋求宇泰科技官方技術支持,建議我更新系統內核(我拒絕!),後來提供了一個說明文件(FTDI.txt),經驗證本機ubuntu14.04的4.4.0內核集成了該USB驅動,免去了安裝麻煩。
(2)環境搭建
ubuntu14.04中預裝了python-serial,其版本爲2.6,須要卸載從新安裝高版本的pyserial,不然會有相關接口錯誤,如‘serial’ object has no attribute 'is_open',執行如下命令,卸載原有python-serial,pip安裝pyserial。
sudo apt-get remove python-serial sudo apt-get install python-pip sudo pip install pyserial
(3)源碼實現
# -*- coding:utf-8 -*- # Author: WUJiang # 運行環境爲Ubuntu14.04&Python2.7 import serial import time ser = serial.Serial("/dev/ttyUSB0", 9600) # 選擇串口,並設置波特率 if ser.is_open: print("port open success") # hex(16進制)轉換爲bytes(2進制),應注意Python2.7與Python3.7此處轉換的不一樣 send_data = 'ff010055000056' send_data = send_data.decode('hex') # 發送數據轉換爲b'\xff\x01\x00U\x00\x00V' ser.write(send_data) # 發送命令 time.sleep(0.1) # 延時,不然len_return_data將返回0,此處易忽視!!! len_return_data = ser.inWaiting() # 獲取緩衝數據(接收數據)長度 if len_return_data: return_data = ser.read(len_return_data) # 讀取緩衝數據 # bytes(2進制)轉換爲hex(16進制),應注意Python2.7與Python3.7此處轉換的不一樣,並轉爲字符串後截取所需數據字段,再轉爲10進制 str_return_data = str(return_data.encode('hex')) feedback_data = int(str_return_data[-6:-2], 16) print(feedback_data) else: print("port open failed")
注意:Python二、Python3中bytes(2進制)與hex(16進制)相互轉換有區別,如下摘自Python-bytes和hex字符串之間的相互轉換。