<del id="d4fwx"><form id="d4fwx"></form></del>
      <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

            <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
          • 怎么使用Python串口實(shí)時顯示數(shù)據(jù)并繪圖-創(chuàng)新互聯(lián)

            這篇文章給大家分享的是有關(guān)怎么使用Python串口實(shí)時顯示數(shù)據(jù)并繪圖的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

            成都創(chuàng)新互聯(lián)公司是專業(yè)的常州網(wǎng)站建設(shè)公司,常州接單;提供做網(wǎng)站、成都做網(wǎng)站,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行常州網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!Python主要用來做什么

            Python主要應(yīng)用于:1、Web開發(fā);2、數(shù)據(jù)科學(xué)研究;3、網(wǎng)絡(luò)爬蟲;4、嵌入式應(yīng)用開發(fā);5、游戲開發(fā);6、桌面應(yīng)用開發(fā)。

            使用pyserial進(jìn)行串口傳輸

            一、安裝pyserial以及基本用法

            在cmd下輸入命令pip install pyserial

            注:升級pip后會出現(xiàn) "‘E:\Anaconda3\Scripts\pip-script.py' is not present."錯誤

            使用 easy_install pip命令就能解決,換一條重新能執(zhí)行安裝的命令

            常用方法:

            ser = serial.Serial(0) 是打開第一個串口

            print ser.portstr 能看到第一個串口的標(biāo)識,windows下是COM1

            ser.write(“hello") 就是往串口里面寫數(shù)據(jù)

            ser.close() 就是關(guān)閉ser表示的串口

            ser.open() 會打開這個串口

            ser = serial.Serial(‘COM1', 115200) 來設(shè)置波特率,當(dāng)然還有專門的函數(shù)

            data = ser.read()可以讀一個字符

            data = ser.read(20) 是讀20個字符

            data = ser.readline() 是讀一行,以/n結(jié)束,要是沒有/n就一直讀,阻塞。

            data = ser.readlines()和ser.xreadlines()都需要設(shè)置超時時間

            ser.baudrate = 9600 設(shè)置波特率

            ser 來查看當(dāng)前串口的狀態(tài)

            ser.isOpen() 看看這個串口是否已經(jīng)被打開

            串行口的屬性:

            name:設(shè)備名字 portstr:已廢棄,用name代替 port:讀或者寫端口 baudrate:波特率

            bytesize:字節(jié)大小 parity:校驗(yàn)位 stopbits:停止位 timeout:讀超時設(shè)置

            writeTimeout:寫超時 xonxoff:軟件流控 rtscts:硬件流控 dsrdtr:硬件流控

            interCharTimeout:字符間隔超時

            二、最基本的串口代碼

            import serial
            portx="COM5"
            bps=9600
            timex=5
            #串口執(zhí)行到這已經(jīng)打開 再用open命令會報(bào)錯
            ser = serial.Serial(portx, int(bps), timeout=1, parity=serial.PARITY_NONE,stopbits=1)
            if (ser.isOpen()):
             print("open success")
             # 向端口些數(shù)據(jù) 字符串必須譯碼
             ser.write("hello".encode()) 
             while (True):
             line = ser.readline() 
             if(line):
              print(line)
              line=0
            else:
             print("open failed")
            ser.close()#關(guān)閉端口
            )

            三、pyqtgraph的使用

            pip install pyqtgraph#顯示波形的界面

            pip install PyQt5#界面要Qt的支持

            pyqtgraph是Python平臺上一種功能強(qiáng)大的2D/3D繪圖庫,相對于matplotlib庫,由于內(nèi)部實(shí)現(xiàn)方式上,使用了高速計(jì)算的numpy信號處理庫以及Qt的GraphicsView框架,因此,它在大數(shù)據(jù)量的數(shù)字處理和快速顯示方面有著巨大的優(yōu)勢,它適合于需要快速繪圖更新、視頻或?qū)崟r交互性的操作場合。另外,它不僅為各種數(shù)據(jù)提供了快速可交互式的圖形顯示,同時也提供了用于快速開發(fā)應(yīng)用程序的各種小工具,如屬性樹、流程圖等小部件,在數(shù)學(xué)、科學(xué)和工程領(lǐng)域都有著廣泛的應(yīng)用。

            import pyqtgraph as pg
            import numpy as np
            import array
            
            app = pg.mkQApp()#建立app
            win = pg.GraphicsWindow()#建立窗口
            win.setWindowTitle(u'pyqtgraph逐點(diǎn)畫波形圖')
            win.resize(800, 500)#小窗口大小
            
            data = array.array('d') #可動態(tài)改變數(shù)組的大小,double型數(shù)組
            historyLength = 100#橫坐標(biāo)長度
            p = win.addPlot()#把圖p加入到窗口中
            p.showGrid(x=True, y=True)#把X和Y的表格打開
            p.setRange(xRange=[0,historyLength], yRange=[-1.2, 1.2], padding=0)
            p.setLabel(axis='left', text='y / V')#靠左
            p.setLabel(axis='bottom', text='x / point')
            p.setTitle('y = sin(x)')#表格的名字
            curve = p.plot()#繪制一個圖形
            idx = 0
            def plotData():
             global idx#內(nèi)部作用域想改變外部域變量
             tmp = np.sin(np.pi / 50 * idx)
             if len(data)<historyLength:
             data.append(tmp)
             else:
             data[:-1] = data[1:]#前移
             data[-1] = tmp
             curve.setData(data)
             idx += 1
            
            timer = pg.QtCore.QTimer()
            timer.timeout.connect(plotData)#定時調(diào)用plotData函數(shù)
            timer.start(50)#多少ms調(diào)用一次
            
            app.exec_()

            怎么使用Python串口實(shí)時顯示數(shù)據(jù)并繪圖

            四、通過多線程實(shí)現(xiàn)串口數(shù)據(jù)的實(shí)時繪圖import pyqtgraph as pg

            主要是開了一個線程去處理串口 剩下的和上面內(nèi)容一樣 就不過多解釋了 直接上代碼

            import array
            import serial
            import threading
            import numpy as np
            import time
            
            
            i = 0
            def Serial():
             while(True):
             n = mSerial.inWaiting()
             if(n):
              if data!=" ":
              dat = int.from_bytes(mSerial.readline(1),byteorder='little') # 格式轉(zhuǎn)換
              n=0
              global i;
              if i < historyLength:
               data[i] = dat
               i = i+1
              else:
               data[:-1] = data[1:]
               data[i-1] = dat
            
            def plotData():
             curve.setData(data)
            
            
            if __name__ == "__main__":
             app = pg.mkQApp() # 建立app
             win = pg.GraphicsWindow() # 建立窗口
             win.setWindowTitle(u'pyqtgraph逐點(diǎn)畫波形圖')
             win.resize(800, 500) # 小窗口大小
             data = array.array('i') # 可動態(tài)改變數(shù)組的大小,double型數(shù)組
             historyLength = 200 # 橫坐標(biāo)長度
             a = 0
             data=np.zeros(historyLength).__array__('d')#把數(shù)組長度定下來
             p = win.addPlot() # 把圖p加入到窗口中
             p.showGrid(x=True, y=True) # 把X和Y的表格打開
             p.setRange(xRange=[0, historyLength], yRange=[0, 255], padding=0)
             p.setLabel(axis='left', text='y / V') # 靠左
             p.setLabel(axis='bottom', text='x / point')
             p.setTitle('semg') # 表格的名字
             curve = p.plot() # 繪制一個圖形
             curve.setData(data)
             portx = 'COM24'
             bps = 19200
             # 串口執(zhí)行到這已經(jīng)打開 再用open命令會報(bào)錯
             mSerial = serial.Serial(portx, int(bps))
             if (mSerial.isOpen()):
             print("open success")
             mSerial.write("hello".encode()) # 向端口些數(shù)據(jù) 字符串必須譯碼
             mSerial.flushInput() # 清空緩沖區(qū)
             else:
             print("open failed")
             serial.close() # 關(guān)閉端口
             th2 = threading.Thread(target=Serial)#目標(biāo)函數(shù)一定不能帶()被這個BUG搞了好久
             th2.start()
             timer = pg.QtCore.QTimer()
             timer.timeout.connect(plotData) # 定時刷新數(shù)據(jù)顯示
             timer.start(50) # 多少ms調(diào)用一次
             app.exec_()

            效果如圖

            怎么使用Python串口實(shí)時顯示數(shù)據(jù)并繪圖

            五、與下位機(jī)通訊實(shí)現(xiàn)波形實(shí)時監(jiān)測

            在這里與第四階段基本相同,需要注意的是,如果收數(shù)據(jù)直接畫圖的話,波形會出現(xiàn)問題。所以串口傳輸數(shù)據(jù)時使用循環(huán)隊(duì)列(先進(jìn)先出),數(shù)據(jù)來之后先進(jìn)隊(duì)列,之后再定時器調(diào)用函數(shù),出隊(duì)列,更新圖。理論上刷新數(shù)據(jù)的時間需要大于下位機(jī)發(fā)送數(shù)據(jù)的間隔時間,否則隊(duì)列會越來越大,而且圖的刷新不連貫。再就是有一個小問題,因?yàn)檎也ㄓ胸?fù)值,我又沒找到很好的把Byte轉(zhuǎn)為char的方法,所以只能手動代碼處理,先轉(zhuǎn)成int類型,再把第八位(符號位)清零,得到絕對值。然后再取負(fù),得到我們需要的數(shù)據(jù)。但發(fā)現(xiàn)Python無法進(jìn)行移位操作,python是int類型是無精度類型,不會發(fā)生溢出而進(jìn)行截取的情況,所以只能先轉(zhuǎn)為二進(jìn)制在移位,太麻煩,直接通過減去一個數(shù)的方法來實(shí)現(xiàn)了。然后直接上代碼吧

            import pyqtgraph as pg
            import array
            import serial
            import threading
            import numpy as np
            from queue import Queue
            import time
            
            
            i = 0
            q = Queue(maxsize=0)
            def Serial():
             global i;
             global q;
             while(True):
             n = mSerial.inWaiting()
             if(n):
              dat = int.from_bytes(mSerial.readline(1),byteorder='little') # 格式轉(zhuǎn)換
              if(dat>>7):
              dat =256-dat
              dat =0-dat
              q.put(dat)
            
            def plotData():
             global i;
             if i < historyLength:
             data[i] = q.get()
             i = i+1
             else:
             data[:-1] = data[1:]
             data[i-1] = q.get()
             curve.setData(data)
            
            
            if __name__ == "__main__":
             app = pg.mkQApp() # 建立app
             win = pg.GraphicsWindow() # 建立窗口
             win.setWindowTitle(u'pyqtgraph逐點(diǎn)畫波形圖')
             win.resize(800, 500) # 小窗口大小
             data = array.array('i') # 可動態(tài)改變數(shù)組的大小,double型數(shù)組
             historyLength = 100 # 橫坐標(biāo)長度
             a = 0
             data=np.zeros(historyLength).__array__('d')#把數(shù)組長度定下來
             p = win.addPlot() # 把圖p加入到窗口中
             p.showGrid(x=True, y=True) # 把X和Y的表格打開
             p.setRange(xRange=[0, historyLength], yRange=[-50, 50], padding=0)
             p.setLabel(axis='left', text='y / V') # 靠左
             p.setLabel(axis='bottom', text='x / point')
             p.setTitle('semg') # 表格的名字
             curve = p.plot() # 繪制一個圖形
             curve.setData(data)
             portx = 'COM25'
             bps = 19200
             # 串口執(zhí)行到這已經(jīng)打開 再用open命令會報(bào)錯
             mSerial = serial.Serial(portx, int(bps))
             if (mSerial.isOpen()):
             dat = 0xff;
             dat >> 2;
             print("open success")
             # 向端口些數(shù)據(jù) 字符串必須譯碼
             mSerial.write("hello".encode())
             mSerial.flushInput() # 清空緩沖區(qū)
             else:
             print("open failed")
             serial.close() # 關(guān)閉端口
             th2 = threading.Thread(target=Serial)
             th2.start()
             timer = pg.QtCore.QTimer()
             timer.timeout.connect(plotData) # 定時刷新數(shù)據(jù)顯示
             timer.start(1) # 多少ms調(diào)用一次
             app.exec_()

            感謝各位的閱讀!關(guān)于“怎么使用Python串口實(shí)時顯示數(shù)據(jù)并繪圖”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

            分享名稱:怎么使用Python串口實(shí)時顯示數(shù)據(jù)并繪圖-創(chuàng)新互聯(lián)
            文章起源:http://www.jbt999.com/article16/doohgg.html

            成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、網(wǎng)站改版網(wǎng)站設(shè)計(jì)、網(wǎng)站導(dǎo)航網(wǎng)站設(shè)計(jì)公司、網(wǎng)站營銷

            廣告

            聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

            微信小程序開發(fā)

              <del id="d4fwx"><form id="d4fwx"></form></del>
              <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

                    <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
                  • 亚洲作爱| 国产精品成人在线视频 | 亚洲射| 成人毛片18女人毛片软件下载 | 天天日天天干天天操天天射 |