<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      全網(wǎng)最適合入門的面向?qū)ο缶幊探坛蹋?1 類和對(duì)象的Python實(shí)現(xiàn)-子類調(diào)用父類方法-模擬串口傳感器和主機(jī)

      全網(wǎng)最適合入門的面向?qū)ο缶幊探坛蹋?1 類和對(duì)象的 Python 實(shí)現(xiàn)-子類調(diào)用父類方法-模擬串口傳感器和主機(jī)

      摘要:

      本節(jié)課,我們主要講解了在 Python 類的繼承中子類如何進(jìn)行初始化、調(diào)用父類的屬性和方法,同時(shí)講解了模擬串口傳感器和主機(jī)類的具體實(shí)現(xiàn),并使用 xcom 串口助手與兩個(gè)類進(jìn)行串口通信使用。

      原文鏈接:

      FreakStudio 的博客

      往期推薦:

      學(xué)嵌入式的你,還不會(huì)面向?qū)ο螅浚浚?/strong>

      全網(wǎng)最適合入門的面向?qū)ο缶幊探坛蹋?0 面向?qū)ο笤O(shè)計(jì)方法導(dǎo)論

      全網(wǎng)最適合入門的面向?qū)ο缶幊探坛蹋?1 面向?qū)ο缶幊痰幕靖拍?/strong>

      全網(wǎng)最適合入門的面向?qū)ο缶幊探坛蹋?2 類和對(duì)象的 Python 實(shí)現(xiàn)-使用 Python 創(chuàng)建類

      全網(wǎng)最適合入門的面向?qū)ο缶幊探坛蹋?3 類和對(duì)象的 Python 實(shí)現(xiàn)-為自定義類添加屬性

      全網(wǎng)最適合入門的面向?qū)ο缶幊探坛蹋?4 類和對(duì)象的Python實(shí)現(xiàn)-為自定義類添加方法

      全網(wǎng)最適合入門的面向?qū)ο缶幊探坛蹋?5 類和對(duì)象的Python實(shí)現(xiàn)-PyCharm代碼標(biāo)簽

      全網(wǎng)最適合入門的面向?qū)ο缶幊探坛蹋?6 類和對(duì)象的Python實(shí)現(xiàn)-自定義類的數(shù)據(jù)封裝

      全網(wǎng)最適合入門的面向?qū)ο缶幊探坛蹋?7 類和對(duì)象的Python實(shí)現(xiàn)-類型注解

      全網(wǎng)最適合入門的面向?qū)ο缶幊探坛蹋?8 類和對(duì)象的Python實(shí)現(xiàn)-@property裝飾器

      全網(wǎng)最適合入門的面向?qū)ο缶幊探坛蹋?9 類和對(duì)象的Python實(shí)現(xiàn)-類之間的關(guān)系

      全網(wǎng)最適合入門的面向?qū)ο缶幊探坛蹋?0 類和對(duì)象的Python實(shí)現(xiàn)-類的繼承和里氏替換原則

      更多精彩內(nèi)容可看:

      給你的 Python 加加速:一文速通 Python 并行計(jì)算

      一文搞懂 CM3 單片機(jī)調(diào)試原理

      肝了半個(gè)月,嵌入式技術(shù)棧大匯總出爐

      電子計(jì)算機(jī)類比賽的“武林秘籍”

      一個(gè)MicroPython的開源項(xiàng)目集錦:awesome-micropython,包含各個(gè)方面的Micropython工具庫

      文檔和代碼獲取:

      可訪問如下鏈接進(jìn)行對(duì)文檔下載:

      https://github.com/leezisheng/Doc

      image

      本文檔主要介紹如何使用 Python 進(jìn)行面向?qū)ο缶幊蹋枰x者對(duì) Python 語法和單片機(jī)開發(fā)具有基本了解。相比其他講解 Python 面向?qū)ο缶幊痰牟┛突驎裕疚臋n更加詳細(xì)、側(cè)重于嵌入式上位機(jī)應(yīng)用,以上位機(jī)和下位機(jī)的常見串口數(shù)據(jù)收發(fā)、數(shù)據(jù)處理、動(dòng)態(tài)圖繪制等為應(yīng)用實(shí)例,同時(shí)使用 Sourcetrail 代碼軟件對(duì)代碼進(jìn)行可視化閱讀便于讀者理解。

      相關(guān)示例代碼獲取鏈接如下:https://github.com/leezisheng/Python-OOP-Demo

      正文

      模擬串口傳感器和主機(jī)類的具體實(shí)現(xiàn):

      接下來看一下我們新建的兩個(gè)類方法的具體實(shí)現(xiàn),可以明確的是,SensorClass 和 MasterClass 都需要調(diào)用 SerialClass 類中有關(guān)串口收發(fā)的方法,也就是子類調(diào)用父類的方法,子類調(diào)用父類的方法有三種方式:

      • 父類名.方法名(self):此時(shí)需要加上父類的類名前綴,且需要帶上 self 參數(shù)變量。該方法單繼承或多繼承均適用。
      • super(子類名,self).父類方法名()/super().父類方法名:使用 super()函數(shù),但如果涉及多繼承,該函數(shù)只能調(diào)用第一個(gè)直接父類的構(gòu)造方法。

      SensorClass 類的實(shí)現(xiàn)

      (1)首先,我們將 SensorClass 中工作狀態(tài)的對(duì)應(yīng)字符表示和命令對(duì)應(yīng)字符表示設(shè)置為類屬性,什么意思?我們來看如下代碼:

      class SensorClass(SerialClass):
          _# 類變量:_
          _#   RESPOND_MODE-響應(yīng)模式-0_
          _#   LOOP_MODE   -循環(huán)模式-1_
          RESPOND_MODE,LOOP_MODE = (0,1)
          _# 類變量:_
          _#   START_CMD       - 開啟命令      -0_
          _#   STOP_CMD        - 關(guān)閉命令      -1_
          _#   SENDID_CMD      - 發(fā)送ID命令    -2_
          _#   SENDVALUE_CMD   - 發(fā)送數(shù)據(jù)命令   -3_
          START_CMD,STOP_CMD,SENDID_CMD,SENDVALUE_CMD = (0,1,2,3)
      

      類屬性歸類所有,與前面講的實(shí)例屬性不同,類屬性就相當(dāng)與全局變量,是實(shí)例對(duì)象共有的屬性,類屬性影響類的所有對(duì)象;而實(shí)例對(duì)象的屬性為實(shí)例對(duì)象自己私有,實(shí)例屬性只影響當(dāng)前對(duì)象。類屬性常用于存儲(chǔ)常量、定義默認(rèn)值或構(gòu)造一個(gè)所有對(duì)象都能訪問的緩存。

      這里,我們定義了兩種類屬性:

      RESPOND_MODE,LOOP_MODE = (0,1)
      

      用于表示 SensorClass 不同工作模式。

      START_CMD,STOP_CMD,SENDID_CMD,SENDVALUE_CMD = (0,1,2,3)
      

      用于表示不同命令。

      (2)在初始化中,我們調(diào)用父類初始化方法進(jìn)行,同時(shí)可以在初始化 SensorClass 類時(shí)指定 id、state、port 三個(gè)參數(shù)。

      def __init__(self,id:int = 0,state:int = RESPOND_MODE,port:str = "COM11"):
              # 調(diào)用父類的初始化方法,super() 函數(shù)將父類和子類連接
              super().__init__(port)
              self.sensorvalue = 0
              self.sensorid    = id
              self.sensorstate = state
      

      這里,實(shí)際上 SensorClass 類初始化的參數(shù)應(yīng)該包括其他有關(guān)串口配置相關(guān)的參數(shù)(波特率、校驗(yàn)位、數(shù)據(jù)位、停止位),由于串口通信雙方這些參數(shù)配置相同,這里為了方便講解故而簡(jiǎn)化。

      (3)模擬傳感器上電初始化,在實(shí)際傳感器上電過程中會(huì)完成校準(zhǔn)、自檢等操作,這里我們簡(jiǎn)單輸出傳感器狀態(tài)和 ID 號(hào):

      _# 傳感器上電初始化_
          def InitSensor(self):
              _# 傳感器上電初始化工作_
              _# 同時(shí)輸出ID號(hào)以及狀態(tài)_
              print("Sensor %d Init complete : %d"%(self.sensorid,self.sensorstate))
      

      (4)在傳感器使能和關(guān)閉方法中,我們開啟或關(guān)閉串口并打印相關(guān)信息:

      _# 開啟傳感器_
          def StartSensor(self):
              super().OpenSerial()
              print("Sensor %d start serial %s "%(self.sensorid,self.dev.port))
              
          _# 停止傳感器_
          def StopSensor(self):
              super().CloseSerial()
              print("Sensor %d close serial %s " % (self.sensorid, self.dev.port))
      

      (5)在傳感器發(fā)送 ID 號(hào)的方法中,我們調(diào)用了父類的 WriteSerial 方法:

      _# 發(fā)送傳感器ID號(hào)_
          def SendSensorID(self):
              super().WriteSerial(str(self.sensorid))
              print("Sensor %d send id "%self.sensorid)
      

      (6)在傳感器發(fā)送數(shù)據(jù)方法中,我們使用如下語句生成一個(gè)隨機(jī)數(shù):

      _# 生成[1, 10]內(nèi)的隨機(jī)整數(shù)_
              data = random.randint(1, 10)
      

      注意,此方法需要使用 import random 語句導(dǎo)入 random 庫。

      同時(shí)調(diào)用父類的 WriteSerial 方法實(shí)現(xiàn)傳感器數(shù)據(jù)的發(fā)送:

      _# 發(fā)送傳感器數(shù)據(jù)_
          def SendSensorValue(self):
              _# 生成[1, 10]內(nèi)的隨機(jī)整數(shù)_
              data = random.randint(1, 10)
              super().WriteSerial(str(data))
              print("Sensor %d send data  %d" % (self.sensorid,data))
      

      (7)在傳感器接收命令方法中,我們調(diào)用了父類的 ReadSerial 接收命令:

      _# 接收主機(jī)指令_
          def RecvMasterCMD(self):
              cmd = super().ReadSerial()
              print("Sensor %d recv cmd %d " % (self.sensorid,cmd))
              return cmd
      

      MasterClass 類的實(shí)現(xiàn)

      (1)首先定義關(guān)于工作模式和命令的類屬性:

      class MasterClass(SerialClass):
          _# 類變量:_
          _#   BUSY_STATE  -忙碌狀態(tài)-0_
          _#   IDLE_STATE  -空閑狀態(tài)-1_
          BUSY_STATE, IDLE_STATE = (0, 1)
          _# 類變量:_
          _#   START_CMD       - 開啟命令      -0_
          _#   STOP_CMD        - 關(guān)閉命令      -1_
          _#   SENDID_CMD      - 發(fā)送ID命令    -2_
          _#   SENDVALUE_CMD   - 發(fā)送數(shù)據(jù)命令   -3_
          START_CMD, STOP_CMD, SENDID_CMD, SENDVALUE_CMD = (0, 1, 2, 3)
      

      (2)在初始化函數(shù)中調(diào)用父類的初始化方法,并定義 valuequeue 和__masterstatue 屬性:

      _# 類的初始化_
          def __init__(self,state:int = IDLE_STATE,port:str = "COM17"):
              _# 調(diào)用父類的初始化方法,super() 函數(shù)將父類和子類連接_
              super().__init__(port)
              self.valuequeue   = queue.Queue(10)
              self.__masterstatue = state
      

      (3)在 StartMaster 方法中我們打開串口并使用 logging.info()方法輸出調(diào)試信息:

      _# 開啟主機(jī)_
          def StartMaster(self):
              super().OpenSerial()
              logging.info("START MASTER :"+self.dev.port)
      

      這里,需要導(dǎo)入 logging 庫并設(shè)置日志輸出級(jí)別:

      import logging
      _# 設(shè)置日志輸出級(jí)別_
      logging.basicConfig(level=logging.DEBUG)
      

      (4)關(guān)閉主機(jī)方法中調(diào)用父類的 CloseSerial 方法:

      _# 停止主機(jī)_
          def StopMaster(self):
              super().CloseSerial()
              logging.info("CLOSE MASTER :" + self.dev.port)
      

      (5)如下調(diào)用父類的 ReadSerial 方法接收 ID 號(hào)和數(shù)據(jù):

      _# 接收傳感器ID號(hào)_
          def RecvSensorID(self):
              sensorid = super().ReadSerial()
              logging.info("MASTER RECIEVE ID : " + str(sensorid))
              return sensorid
      
          _# 接收傳感器數(shù)據(jù)_
          def RecvSensorValue(self):
              data = super().ReadSerial()
              logging.info("MASTER RECIEVE DATA : " + str(data))
              self.valuequeue.put(data)
              return data
      

      (6)調(diào)用父類的 WriteSerial 方法發(fā)送指令:

      _# 主機(jī)發(fā)送命令_
          def SendSensorCMD(self,cmd):
              super().WriteSerial(str(cmd))
              logging.info("MASTER SEND CMD : " + str(cmd))
      

      (7)如下 RetMasterStatue 方法獲取主機(jī)狀態(tài):

      _# 主機(jī)返回工作狀態(tài)-_
          def RetMasterStatue(self):
              return self.__masterstatue
      

      完整代碼

      以下為兩個(gè)類的完整代碼:

      class SensorClass(SerialClass):
          _# 類變量:_
          _#   RESPOND_MODE -響應(yīng)模式-0_
          _#   LOOP_MODE    -循環(huán)模式-1_
          RESPOND_MODE,LOOP_MODE = (0,1)
          _# 類變量:_
          _#   START_CMD       - 開啟命令      -0_
          _#   STOP_CMD        - 關(guān)閉命令      -1_
          _#   SENDID_CMD      - 發(fā)送ID命令    -2_
          _#   SENDVALUE_CMD   - 發(fā)送數(shù)據(jù)命令   -3_
          START_CMD,STOP_CMD,SENDID_CMD,SENDVALUE_CMD = (0,1,2,3)
      
          _# 類的初始化_
          def __init__(self,port:str = "COM11",id:int = 0,state:int = RESPOND_MODE):
              _# 調(diào)用父類的初始化方法,super() 函數(shù)將父類和子類連接_
              super().__init__(port)
              self.sensorvalue = 0
              self.sensorid    = id
              self.sensorstate = state
          _# 傳感器上電初始化_
          def InitSensor(self):
              _# 傳感器上電初始化工作_
              _# 同時(shí)輸出ID號(hào)以及狀態(tài)_
              print("Sensor %d Init complete : %d"%(self.sensorid,self.sensorstate))
          _# 開啟傳感器_
          def StartSensor(self):
              super().OpenSerial()
              print("Sensor %d start serial %s "%(self.sensorid,self.dev.port))
          _# 停止傳感器_
          def StopSensor(self):
              super().CloseSerial()
              print("Sensor %d close serial %s " % (self.sensorid, self.dev.port))
          _# 發(fā)送傳感器ID號(hào)_
          def SendSensorID(self):
              super().WriteSerial(str(self.sensorid))
              print("Sensor %d send id "%self.sensorid)
          _# 發(fā)送傳感器數(shù)據(jù)_
          def SendSensorValue(self):
              _# 生成[1, 10]內(nèi)的隨機(jī)整數(shù)_
              data = random.randint(1, 10)
              super().WriteSerial(str(data))
              print("Sensor %d send data  %d" % (self.sensorid,data))
          _# 接收主機(jī)指令_
          def RecvMasterCMD(self):
              cmd = super().ReadSerial()
              print("Sensor %d recv cmd %d " % (self.sensorid,cmd))
              return cmd
      
      class MasterClass(SerialClass):
          _# 類變量:_
          _#   BUSY_STATE  -忙碌狀態(tài)-0_
          _#   IDLE_STATE  -空閑狀態(tài)-1_
          BUSY_STATE, IDLE_STATE = (0, 1)
          START_CMD, STOP_CMD, SENDID_CMD, SENDVALUE_CMD = (0, 1, 2, 3)
      
          _# 類的初始化_
          def __init__(self,state:int = IDLE_STATE,port:str = "COM17"):
              _# 調(diào)用父類的初始化方法,super() 函數(shù)將父類和子類連接_
              super().__init__(port)
              self.valuequeue   = queue.Queue(10)
              self.__masterstatue = state
          _# 開啟主機(jī)_
          def StartMaster(self):
              super().OpenSerial()
              logging.info("START MASTER :"+self.dev.port)
          _# 停止主機(jī)_
          def StopMaster(self):
              super().CloseSerial()
              logging.info("CLOSE MASTER :" + self.dev.port)
          _# 接收傳感器ID號(hào)_
          def RecvSensorID(self):
              sensorid = super().ReadSerial()
              logging.info("MASTER RECIEVE ID : " + str(sensorid))
              return sensorid
          _# 接收傳感器數(shù)據(jù)_
          def RecvSensorValue(self):
              data = super().ReadSerial()
              logging.info("MASTER RECIEVE DATA : " + str(data))
              self.valuequeue.put(data)
              return data
          _# 主機(jī)發(fā)送命令_
          def SendSensorCMD(self,cmd):
              super().WriteSerial(str(cmd))
              logging.info("MASTER SEND CMD : " + str(cmd))
          _# 主機(jī)返回工作狀態(tài)-_
          def RetMasterStatue(self):
              return self.__masterstatue
      

      模擬實(shí)例

      這里,我們使用 XCOM 軟件和我們的 Python 程序進(jìn)行交互。

      傳感器實(shí)驗(yàn)?zāi)M

      這里,我們首先在主函數(shù)中創(chuàng)建傳感器對(duì)象,完成初始化后使能傳感器中串口模塊,并設(shè)置循環(huán),輪詢讀取指令并執(zhí)行操作,示例代碼如下:

      if __name__ == "__main__":
          _# 創(chuàng)建傳感器對(duì)象_
          s = SensorClass(port="COM11", id=1, state=SensorClass.RESPOND_MODE)
          _# 初始化傳感器_
          s.InitSensor()
          _# 傳感器開啟_
          s.StartSensor()
      
          while True:
              _# 根據(jù)不同指令執(zhí)行不同操作_
              cmd = s.RecvMasterCMD()
              _# START_CMD, STOP_CMD, SENDID_CMD, SENDVALUE_CMD = (0, 1, 2, 3)_
              if cmd == SensorClass.SENDID_CMD:
                  s.SendSensorID()
              elif cmd == SensorClass.SENDVALUE_CMD:
                  s.SendSensorValue()
              elif cmd == SensorClass.STOP_CMD:
                  s.StopSensor()
                  break
          print(" Sensor Stop Work!")
      

      我們來看一下實(shí)際驗(yàn)證效果:

      image

      主機(jī)實(shí)驗(yàn)?zāi)M

      這里,我們首先在主函數(shù)中創(chuàng)建并開啟主機(jī)對(duì)象,我們的 xcom 模擬傳感器,主機(jī)在輪詢中發(fā)送接收數(shù)據(jù)指令,并將接收的數(shù)據(jù)加入主機(jī)類的隊(duì)列,最后發(fā)送停機(jī)命令,并關(guān)閉主機(jī)。

      if __name__ == "__main__":
          m = MasterClass(state=MasterClass.IDLE_STATE, port="COM17")
          m.StartMaster()
      
          _# START_CMD, STOP_CMD, SENDID_CMD, SENDVALUE_CMD = (0, 1, 2, 3)_
          _# 發(fā)送指令,獲取傳感器ID_
          m.SendSensorCMD(MasterClass.SENDID_CMD)
          m.RecvSensorID()
      
          for i in range(3):
              _# 發(fā)送指令,獲取傳感器數(shù)據(jù)_
              m.SendSensorCMD(MasterClass.SENDVALUE_CMD)
              m.RecvSensorValue()
      
          m.SendSensorCMD(MasterClass.STOP_CMD)
          m.StopMaster()
      
          print("Master Stop Work!")
      

      這里我們將主機(jī)日志打印到文件中:

      _# 在配置下日志輸出目標(biāo)文件和日志格式_
      LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s"
      logging.basicConfig(filename='my.log', level=logging.DEBUG, format=LOG_FORMAT)
      

      我們來看一下實(shí)際驗(yàn)證效果:

      image

      可以看到兩個(gè)實(shí)驗(yàn)都可以完整運(yùn)行,關(guān)于兩個(gè)類的交互工作,我們將在后續(xù)多線程中講到。

      image

      posted @ 2024-07-09 01:16  FreakStudio  閱讀(94)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 中文字幕国产在线精品| 国产系列丝袜熟女精品视频 | 人妻少妇无码精品专区| 久久精品欧美日韩精品| 最新亚洲人成网站在线观看| 精品亚洲国产成人性色av| 国产日韩av二区三区| 日本一卡2卡3卡四卡精品网站| 亚洲美女厕所偷拍美女尿尿| 国色天香中文字幕在线视频| 最新中文字幕av无码专区不| 九九热精品免费在线视频| 蜜臀av午夜精品福利| 亚洲码和欧洲码一二三四| 亚洲黄色一级片在线观看| 快好爽射给我视频| 开心五月深深爱天天天操| 国产精品成人久久电影| 欧美成人免费全部| 国产综合一区二区三区麻豆| 国产精品中文字幕久久| 内射极品少妇xxxxxhd| 亚洲精品第一页中文字幕| 69人妻精品中文字幕| 凸凹人妻人人澡人人添| 日韩av天堂综合网久久| 国产av国片精品一区二区| 中文字幕va一区二区三区| 亚洲天堂男人的天堂在线| 99精品国产综合久久久久五月天| 欧美极品少妇×xxxbbb| 天干天干啦夜天干天2017| 国产一区二区日韩经典| 欧美日韩精品久久久免费观看| 久久亚洲精品天天综合网| 亚洲高清WWW色好看美女| 扶绥县| 四虎影视库国产精品一区| 精品一区二区不卡无码AV| 少妇人妻偷人精品免费| 亚洲人成人网站色www|