當前位置:九游会j9娱乐平台-九游ag登录中心网址 » 編程語言 » python串口接收

python串口接收-九游会j9娱乐平台

發布時間: 2024-01-17 03:49:12

a. 如何用python寫個串口通信的程序

使用 pyserial 就可以處理串口通信,這個包是跨平台的。

http://pyserial.sourceforge.net/


示常式序在這里:

https://pyserial.readthedocs.io/en/latest/examples.html#wxpython-examples


importserial

#創建serial實例
serialport=serial.serial()
serialport.port='com1'
serialport.baudrate=9600
serialport.parity='n'
serialport.bytesize=8
serialport.stopbits=1
serialport.timeout=0.6
try:
serialport.open()
serialport.setdtr(true)
serialport.setrts(true)
exceptexception,ex:
printex

#發送數據
serialport.write(raw_data)

#根據項目要求,可以開一個線程掃描接收數據

b. 如何用python實現串口通信

python非常適合寫一些測試的腳本,如快速的串口通信測試等。如果使用vc qt開發,可能用時較多,使用python,如果掌握使用方法,可以直接讀寫測試,配合設備或是串口助手,很快驗證與實現。
python有沒有現成的串口api直接調用呢?經過實踐驗證,需要安裝一個叫 pyserial的組件即可。這個可以在github上下載。

在windows 7 64bit 上可以使用嗎?當然可以使用,我安裝的python3.5為64位的。把下載後的文件,其中有一個serial的文件夾,拷貝到python35安裝路徑, c:\python35\lib\site-packages\serial
網上可以搜一下windows的安裝包,安裝完也是:c:\python35\lib\site-packages\serial ,可以用最新的版本,替換即可。
測試的方法:在python ide里測試:
>>> import serial
這里如果報錯,是python版本與pyserial版本沒有配合好。如果正常,不返回,即可以導入serial模塊。
>>> ser=serial.serial("com5",115200)
這里為com5,115200的波特率。如果打不開,請檢查安裝環境。
>>> ser.write('hello,serial test'.encode())
17
發送測試(如果返回位元組數,說明返回成功),這里需要轉換一個編碼為位元組。
以上測試,可以使用現在的設備或是串口助手,如安裝virtual serial port driver 7.2 虛擬串口軟體,設置一對串口,進行自發自收的測試。
>>> print(ser.readline())
b'abcdefg\r\n'
這里是串口接收,有接收的超時。設備或是串口助手發送一個字元串,以回車換行結束,這里就可以收到列印出來。
也可以用ser.read(),這里只接收一個字元來實現。
上面已經實現了基本的串口操作。
關閉串口為:
>>> ser.close()
如果使用python,一般寫個py文件,就像windows bat 批處理一樣,這是python強大的地方。如果寫一個py腳本呢?其實只要把上面的命令,一條條寫下來,就是一個腳本,測試如下:
import serialser=serial.serial("com5",115200,timeout=0.5)for i in range(0,100-1):ser.write('hello\r\n'.encode())print(ser.readline());ser.close()

c. 調用python模塊串口的write寫的數據與串口實際寫的數

1、寫入的數據長度不一致。在使用python的`serial`模散旅汪塊進行串口通信時,使用`write`函數寫入數據時需要指定寫入數據的長度,如果指定的長度與實際寫入的數據長度不一致,就會導致寫入的數據與實際寫入的數據不同。
2、串口參數設置不正確。在使用python的`serial`模塊進行串口通信時,需要設置鎮緩串口的通信參數,如波特率、數據位、校驗位、停止位等。如果設置不正確,就會導致寫入的數據與實際寫入的數據不同。
3、串口通信過程中出現錯誤。在串口通信過程中,可能會出現一些錯誤,如數據丟失、數據重復等問題,這也會導致寫入的數據與實際寫入的數據不同。沖仔

d. python - serial communication(串口通信)

由於測試工作的需要,在c端產品上經常使用串口進行通信,而測試腳本大部分時候又採用python編寫,於是就不得不了解並熟悉python下的串口通信實現方法了,整理如下以備隨時使用:

一、說明

pyserial封裝了python環境下對串口的訪問,其兼容各種平台,並有統一的操作介面。通過python屬性訪問串口設置,並可對串口的各種配置參數(如串口名,波特率、停止校驗位、流控、超時等等)做修改,再進行串口通信的類與介面封裝後,非常方便地被調用和移植。

二、模塊安裝

pip insatll pyserial

三、初始化與參數說明

import serial

ser = serial.serial('com3', 115200, timeout=0.5, ....................)

下面看看 serial.serial 原生類

四、不同平台下初始化

ser=serial.serial("/dev/ttyusb0",9600,timeout=0.5)#使用usb連接串列口ser=serial.serial("/dev/ttyama0",9600,timeout=0.5)#使用樹莓派的gpio口連接串列口ser=serial.serial(1,9600,timeout=0.5)#winsows系統使用com1口連接串列口ser=serial.serial("com1",9600,timeout=0.5)#winsows系統使用com1口連接串列口ser=serial.serial("/dev/ttys1",9600,timeout=0.5)#linux系統使用com1口連接串列口

五、串口屬性

ser.name #串口名稱

ser.port #埠號

ser.baudrate #波特率

ser.bytesize #位元組大小

ser.parity #校驗位n-無校驗,e-偶校驗,o-奇校驗

ser.stopbits #停止位

ser.timeout #讀超時設置

ser.writetimeout #寫超時

ser.xonxoff #軟體流控

ser.rtscts #硬體流控

ser.dsrdtr #硬體流控

ser.interchartimeout #字元間隔超時 

六、串口常用方法

isopen():查看埠是否被打開。

open() :打開埠『。

close():關閉埠。

read(size=1):從埠讀位元組數據。默認1個位元組。

read_all():從埠接收全部數據。

write(data):向埠寫數據。

readline():讀一行數據。

readlines():讀多行數據。

in_waiting():返回輸入緩存中的位元組數。

out_waiting():返回輸出緩存中的位元組數。

flush():等待所有數據寫出。

flushinput():丟棄接收緩存中的所有數據。

flushoutput():終止當前寫操作,並丟棄發送緩存中的數據。

sendbreadk(ration=0.25):發送break條件,並於ration時間之後返回idle

setbreak(level=true):根據level設置break條件。

setrts(level=true):設置請求發送(rts)的控制信號

setdtr(level=true):設置數據終端准備就緒的控制信號

七、類與介面封裝

import time

import serial

import serial.tools.list_ports

# 串口操作類

class serialcommunication(object):

    def __init__(self, port, bps, timeout):# 可配置更多參數

        port_list =self.show_usable_com()

        if len(port_list) >0:

            if portnot in port_list:

                self.port = port_list[0]

            else:

                self.port = port

        else:

            print("no usable serial, please plugin your serial board")

            return

        self.bps = bps

        self.timeout = timeout

        try:

            # 初始化串口,並得到串口對象,根據需要可拓展更多參數

            self.ser = serial.serial(self.port, self.bps, 8, 'n', 1, timeout=self.timeout, write_timeout=self.timeout)

        except exception as e:# 拋出異常

            print("exception={}".format(e))

    # 顯示可用串口列表

    @staticmethod

    def show_usable_com():

        serialport_list = []

        portinfo_list =list(serial.tools.list_ports.comports())

        if len(portinfo_list) <=0:

            print("can not find any serial port!")

        else:

            print(portinfo_list)

            for i in range(len(portinfo_list)):

                plist =list(portinfo_list[i])

                print(plist)

                serialport_list.append(plist[0])

            print(serialport_list)

            return serialport_list

# 輸出串口基本信息

    def serial_infor(self):

        print(self.ser.name)# 設備名字

        print(self.ser.port)# 讀或者寫埠

        print(self.ser.baudrate)# 波特率

        print(self.ser.bytesize)# 位元組大小

        print(self.ser.parity)# 校驗位

        print(self.ser.stopbits)# 停止位

        print(self.ser.timeout)# 讀超時設置

        print(self.ser.writetimeout)# 寫超時

        print(self.ser.xonxoff)# 軟體流控

        print(self.ser.rtscts)# 軟體流控

        print(self.ser.dsrdtr)# 硬體流控

        print(self.ser.interchartimeout)# 字元間隔超時

    # 打開串口

    def serial_open(self):

        try:

            if not self.ser.isopen():

                self.ser.open()

        except exception as e:# 拋出異常

            print("serial_open exception={}".format(e))

            self.ser.close()

    # 讀取指定大小的數據

    # 從串口讀size個位元組。如果指定超時,則可能在超時後返回較少的位元組;如果沒有指定超時,則會一直等到收完指定的位元組數。

    def serial_read_with_size(self, size):

        try:

            self.serial_open()

            return self.ser.read(size).decode("utf-8")

        except exception as e:

            print("serial_read_all exception={}".format(e))

            self.ser.close()

    # 讀取當前串口緩存中的所有數據

    def serial_read_data(self):

        try:

            self.serial_open()

            datalen =self.ser.inwaiting()

            if datalen ==0:

                return none

            return self.ser.read(datalen).decode("utf-8")

        except exception as e:

            print("serial_read_data exception={}".format(e))

            self.ser.close()

    # 讀串口全部數據,注意timeout的設置

    # 在設定的timeout時間范圍內,如果讀取的位元組數據是有效的(就是非空)那就直接返回,

    # 否則一直會等到設定的timeout時間並返回這段時間所讀的全部位元組數據。

    def serial_read_all(self):

        try:

            self.serial_open()

            return self.ser.read_all().decode("utf-8")

        except exception as e:

            print("serial_read_all exception={}".format(e))

            self.ser.close()

    # 讀一行數據

    # 使用readline()時應該注意:打開串口時應該指定超時,否則如果串口沒有收到新行,則會一直等待。

    # 如果沒有超時,readline會報異常。

    def serial_read_line(self):

        try:

            self.serial_open()

            return self.ser.readline().decode("utf-8")

        except exception as e:

            print("serial_read_line exception={}".format(e))

            self.ser.close()

    # 讀多行數據,返回行列表

    def serial_read_lines(self):

        try:

            self.serial_open()

            return self.ser.readlines().decode("utf-8")

        except exception as e:

            print("serial_read_lines exception={}".format(e))

            self.ser.close()

    # 寫數據

    def serial_write_data(self, data):

        try:

            self.serial_open()

            self.ser.flushoutput()

            data_len =self.ser.write(data.encode('utf-8'))

            return data_len

        except exception as e:

            print("serial_write_data exception={}".format(e))

            return 0

    # 寫行數據,注意參數差異

    def serial_write_lines(self, lines):

        self.ser.writelines(lines)

    # 清除串口緩存

    def serial_clean(self):

        try:

            if self.ser.isopen():

                self.ser.flush()

        except exception as e:

            print("serial_clean exception={}".format(e))

    # 關閉串口

    def serial_close(self):

        try:

            if self.ser.isopen():

                self.ser.close()

        except exception as e:

            print("serial_clean exception={}".format(e))

if __name__ =='__main__':

    testserial = serialcommunication("com10", 1500000, 0.5)

    testserial.serial_open()

    testserial.serial_infor()

    testserial.serial_write_data("ifconfig eth0\n")

    time.sleep(0.1)

    data = testserial.serial_read_all()

    print(data)

    testserial.serial_close()

八、其他

1)ser.version表示pyserial版本; 另外,ser.name表示設備名稱

2)埠設置可以被讀入字典,也可從字典載入設置:

    getsettingdict():返回當前串口設置的字典

    applysettingdict(d):應用字典到串口設置

3) readline()是讀一行,以/n結束,要是沒有/n就一直讀,阻塞。注意:打開串口時應該指定超時,否則如果串口沒有收到新行,則會一直等待。

4)serial.read_all 與 serial.read_all()區別

    serial.read_all:讀取串口所有的參數信息

    serial.read_all():超時時間內從串口讀取的所有數據

5) 異常信息

    exception serial.serialexception

    exception serial.serialtimeoutexception

熱點內容
愛奇藝正義聯盟為啥不能緩存 發布:2024-01-20 00:52:13 瀏覽:248
caccess查詢資料庫 發布:2024-01-20 00:43:10 瀏覽:769
xp文件夾圖標更改 發布:2024-01-20 00:43:03 瀏覽:19
python和node 發布:2024-01-20 00:37:12 瀏覽:194
android拖拉 發布:2024-01-20 00:00:49 瀏覽:583
少兒編程課程體系介紹 發布:2024-01-20 00:00:48 瀏覽:846
我說你做下載ftp 發布:2024-01-20 00:00:47 瀏覽:8
安卓驅動培訓哪裡好 發布:2024-01-19 23:55:41 瀏覽:987
python轉為字元串 發布:2024-01-19 23:51:39 瀏覽:272
合同文件夾 發布:2024-01-19 23:50:52 瀏覽:740
网站地图