Python-使用pyserial與控制板溝通
最近在研究個專案,從sensor即時讀取資料透過USB傳到電腦進訓練好的分類模型進行損壞類別判斷並用GUI呈現,而板子與電腦傳輸使用到python的pyserial實作。
一開始先到裝置管理員確認COM PORT若讀不到記得刪除然後更新驅動,並確認板子的傳輸速率。
這邊我採用一發一收,我發個訊號給板子,板子才會把讀到的電壓值給我。
這範例他一次發送就是18筆bytes,扣除頭尾作為一次發送的判斷,其餘每兩筆可轉換成一組電壓值。
因此我兩組資料要一起做個計算還原電壓值,公式可參考註解(高位元加上低位元*3.3伏特/4095 2的16次方位元)
每個人板子寫的邏輯跟資料都不一樣,所以可單純參考對板子發送資料與接收資料。
一開始先到裝置管理員確認COM PORT若讀不到記得刪除然後更新驅動,並確認板子的傳輸速率。
這邊我採用一發一收,我發個訊號給板子,板子才會把讀到的電壓值給我。
這範例他一次發送就是18筆bytes,扣除頭尾作為一次發送的判斷,其餘每兩筆可轉換成一組電壓值。
因此我兩組資料要一起做個計算還原電壓值,公式可參考註解(高位元加上低位元*3.3伏特/4095 2的16次方位元)
每個人板子寫的邏輯跟資料都不一樣,所以可單純參考對板子發送資料與接收資料。
import serial
import time
COM_PORT = 'COM15' # 指定通訊埠名稱
BAUD_RATES = 19200 # 設定傳輸速率
ser = serial.Serial(COM_PORT, BAUD_RATES) # 初始化序列通訊埠
try:
while True:
values = bytearray([3]) #板子收到3會對電腦傳一組資料
ser.write(values) #發送資料跟FPGA要值
i = 0
high = 0.0
total = 0.0
while ser.in_waiting: # 若收到序列資料…
data_raw = ser.read(1) # 讀取一筆 共18筆扣掉1跟18 每兩筆可轉換成一組電壓值
data = int.from_bytes(data_raw, "big") # byte to int
print('接收到的資料:', data)
i = i + 1
print(str(i))
if(i == 1): #去頭
continue
if(i == 18 ): #去尾
high = 0.0
total = 0.0
i = 0
break
if i % 2 == 0:
high = data * 256 #高位元*256 2的八次方
if i % 2 == 1:
total = (high + data) * 3.3 / 4095 #高位元加上低位元*3.3伏特/4095 2的16次方位元
print("電壓值:"+str(total)) #電壓值
high = 0.0
total = 0.0
except KeyboardInterrupt:
ser.close() # 清除序列通訊物件
print('結束!')
留言
張貼留言