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('結束!')
留言
張貼留言