亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

對python3 Serial 串口助手的接收讀取數據方法詳解

系統 1521 0

其實網上已經有許多python語言書寫的串口,但大部分都是python2寫的,沒有找到一個合適的python編寫的串口助手,只能自己來寫一個串口助手,由于我只需要串口能夠接收讀取數據就可以了,故而這個串口助手只實現了數據的接收讀取。

創建串口助手首先需要創建一個類,重構類的實現過程如下:

            
#coding=gb18030

import threading
import time
import serial

class ComThread:
 def __init__(self, Port='COM3'):
 #構造串口的屬性
  self.l_serial = None
  self.alive = False
  self.waitEnd = None
  self.port = Port
  self.ID = None
  self.data = None
 #定義串口等待的函數
 def waiting(self):
  if not self.waitEnd is None:
   self.waitEnd.wait()

 def SetStopEvent(self):
  if not self.waitEnd is None:
   self.waitEnd.set()
  self.alive = False
  self.stop()
 #啟動串口的函數
 def start(self):
  self.l_serial = serial.Serial()
  self.l_serial.port = self.port
  self.l_serial.baudrate = 115200
  #設置等待時間,若超出這停止等待
  self.l_serial.timeout = 2
  self.l_serial.open()
  #判斷串口是否已經打開
  if self.l_serial.isOpen():
   self.waitEnd = threading.Event()
   self.alive = True
   self.thread_read = None
   self.thread_read = threading.Thread(target=self.FirstReader)
   self.thread_read.setDaemon(1)
   self.thread_read.start()
   return True
  else:
   return False
          

創建好類后,就要實現串口讀取的功能,其讀取數據的函數如下:

首先要創建一個字符串來存放接收到的數據:

            
   data = ''
   data = data.encode('utf-8')#由于串口使用的是字節,故而要進行轉碼,否則串口會不識別
          

在創建好變量來接收數據后就要開始接收數據:

            
n = self.l_serial.inWaiting()#獲取接收到的數據長度
   if n: 
     #讀取數據并將數據存入data
     data = data + self.l_serial.read(n)
     #輸出接收到的數據
     print('get data from serial port:', data)
     #顯示data的類型,便于如果出錯時檢查錯誤
     print(type(data))
          

將數據接收完后,就要對接收到的數據進行處理,提取出有用信息,由于下位機使用的協議不一樣,因此處理的方法也不一樣,我使用的協議是**+ID+*Data+*,因此我的提取方法如下:

            
#獲取還沒接收到的數據長度
n = self.l_serial.inWaiting()
#判斷是否已經將下位機傳輸過來的數據全部提取完畢,防止之前沒有獲取全部數據
if len(data)>0 and n==0:
 try:
  #將數據轉換為字符型
  temp = data.decode('gb18030')
  #輸出temp類型,看轉碼是否成功
  print(type(temp))
  #輸出接收到的數據
  print(temp)
  將數據按換行分割并輸出
  car,temp = str(temp).split("\n",1)
  print(car,temp)
 
  #將temp按':'分割,并獲取第二個數據
  string = str(temp).strip().split(":")[1]
  #由于前面分割后的數據類型是列表,因此需要轉換成字符串,而后按照'*'分割,得到的也就是我們需要的Id和data
  str_ID,str_data = str(string).split("*",1)
 
  print(str_ID)
  print(str_data)
  print(type(str_ID),type(str_data))
  #判斷data最后一位是否是'*',若是則退出,若不是則輸出異常
  if str_data[-1]== '*':
   break
  else:
   print(str_data[-1])
   print('str_data[-1]!=*')
 except:
  print("讀卡錯誤,請重試!\n")
          

其輸出結果為:

            
get data from serial port:b'ID:4A622E29\n\xbf\xa8\xd6\xd0\xbf\xe924\xca\xfd\xbe\xdd\xce\xaa:1*80*\r\n'

            
              
                
ID:4A622E29
卡中塊24數據為:1*80*

ID:4A622E29 卡中塊24數據為:1*80*
80*

                
                  
                
              
            
          

串口助手完整代碼如下:

            
#coding=gb18030

import threading
import time
import serial

class ComThread:
 def __init__(self, Port='COM3'):
  self.l_serial = None
  self.alive = False
  self.waitEnd = None
  self.port = Port
  self.ID = None
  self.data = None

 def waiting(self):
  if not self.waitEnd is None:
   self.waitEnd.wait()

 def SetStopEvent(self):
  if not self.waitEnd is None:
   self.waitEnd.set()
  self.alive = False
  self.stop()

 def start(self):
  self.l_serial = serial.Serial()
  self.l_serial.port = self.port
  self.l_serial.baudrate = 115200
  self.l_serial.timeout = 2
  self.l_serial.open()
  if self.l_serial.isOpen():
   self.waitEnd = threading.Event()
   self.alive = True
   self.thread_read = None
   self.thread_read = threading.Thread(target=self.FirstReader)
   self.thread_read.setDaemon(1)
   self.thread_read.start()
   return True
  else:
   return False

 def SendDate(self,i_msg,send):
  lmsg = ''
  isOK = False
  if isinstance(i_msg):
   lmsg = i_msg.encode('gb18030')
  else:
   lmsg = i_msg
  try:
   # 發送數據到相應的處理組件
   self.l_serial.write(send)
  except Exception as ex:
   pass;
  return isOK

 def FirstReader(self):
  while self.alive:
   time.sleep(0.1)

   data = ''
   data = data.encode('utf-8')

   n = self.l_serial.inWaiting()
   if n:
     data = data + self.l_serial.read(n)
     print('get data from serial port:', data)
     print(type(data))

   n = self.l_serial.inWaiting()
   if len(data)>0 and n==0:
    try:
     temp = data.decode('gb18030')
     print(type(temp))
     print(temp)
     car,temp = str(temp).split("\n",1)
     print(car,temp)

     string = str(temp).strip().split(":")[1]
     str_ID,str_data = str(string).split("*",1)

     print(str_ID)
     print(str_data)
     print(type(str_ID),type(str_data))

     if str_data[-1]== '*':
      break
     else:
      print(str_data[-1])
      print('str_data[-1]!=*')
    except:
     print("讀卡錯誤,請重試!\n")

  self.ID = str_ID
  self.data = str_data[0:-1]
  self.waitEnd.set()
  self.alive = False

 def stop(self):
  self.alive = False
  self.thread_read.join()
  if self.l_serial.isOpen():
   self.l_serial.close()
#調用串口,測試串口
def main():
 rt = ComThread()
 rt.sendport = '**1*80*'
 try:
  if rt.start():
   print(rt.l_serial.name)
   rt.waiting()
   print("The data is:%s,The Id is:%s"%(rt.data,rt.ID))
   rt.stop()
  else:
   pass
 except Exception as se:
  print(str(se))

 if rt.alive:
  rt.stop()

 print('')
 print ('End OK .')
 temp_ID=rt.ID
 temp_data=rt.data
 del rt
 return temp_ID,temp_data


if __name__ == '__main__':

 #設置一個主函數,用來運行窗口,便于若其他地方下需要調用串口是可以直接調用main函數
 ID,data = main()

 print("******")
 print(ID,data)
          

以上這篇對python3 Serial 串口助手的接收讀取數據方法詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 免费视频爰爱太爽了 | 日本在线精品视频 | 久久久久免费视频 | 伊人色综合网 | 欧美精品久久久久久久影视 | 69做爰视频在线观看 | 久久久久国产成人精品 | 亚洲精品一区国产二区 | 欧美日韩第三页 | 欧美伊人久久大香线蕉综合69 | 玖玖精品在线 | 久久亚洲私人国产精品 | 久久综合九色综合97_ 久久久 | 国产伦一区二区三区免费 | 又刺激又黄的一级毛片 | 成人牲交一极毛片 | 一级a俄罗斯毛片免费 | 中文日韩字幕一区在线观看 | 国产在线欧美精品 | 久久伊人中文字幕 | 国产一区视频在线播放 | 国产在线免 | 色偷偷亚洲天堂 | 久久婷婷久久一区二区三区 | 性欧美videos高清喷水 | 黄色毛片在线播放 | 日韩午夜伦 | 一级片在线免费看 | 国产特级毛片aaaaaaa高清 | 久久精品免视国产 | 亚洲高清国产一区二区三区 | 亚洲婷婷在线视频 | 精品国产一区二区三区19 | 六月婷婷色 | 性做久久久久久久久25的美女 | 久草视频在线观 | 国产亚洲精品国产 | 亚洲欧美中日韩 | www.夜夜操 | 91福利视频网站 | 亚洲成a人片毛片在线 |