python實(shí)現(xiàn)串口通信的示例代碼
python實(shí)現(xiàn)串口通信是一件簡(jiǎn)單的事情,只要通過(guò)pyserial模塊就可以實(shí)現(xiàn)。
一、串口通信
1、什么是串口通信?
串口通信是一種通過(guò)串行接口(Serial Port)進(jìn)行數(shù)據(jù)傳輸?shù)耐ㄐ欧绞健T诖谕ㄐ胖?,?shù)據(jù)位按順序一位一位地傳輸,相比并行通信,串口通信只需要幾根線纜就能實(shí)現(xiàn)數(shù)據(jù)傳輸。串口通信通常用于連接計(jì)算機(jī)與外部設(shè)備,例如傳感器、打印機(jī)、微控制器等。串口通信主要有兩種標(biāo)準(zhǔn):RS-232和RS-485。
(1)RS-232:RS-232是一種單點(diǎn)通信協(xié)議,適用于連接兩臺(tái)設(shè)備,其中一臺(tái)設(shè)備作為主設(shè)備(例如計(jì)算機(jī)),另一臺(tái)設(shè)備作為從設(shè)備。RS-232使用多根線纜,包括數(shù)據(jù)線、控制線和地線。RS-232通信距離較短,通常在15米以內(nèi)。
(2)RS-485:RS-485是一種多點(diǎn)通信協(xié)議,適用于連接多個(gè)設(shè)備。RS-485可以連接多達(dá)128個(gè)設(shè)備,其中每個(gè)設(shè)備都有獨(dú)特的地址。RS-485使用兩根線纜(A線和B線)進(jìn)行數(shù)據(jù)傳輸,這種差分信號(hào)傳輸方式使得RS-485通信距離可以達(dá)到1200米,同時(shí)具備抗干擾能力。
串口通信通常以串行數(shù)據(jù)的形式傳輸,其中數(shù)據(jù)位逐位傳輸,通信的兩端使用同樣的波特率、數(shù)據(jù)位、停止位和校驗(yàn)位等參數(shù),以確保正確的數(shù)據(jù)傳輸。串口通信在工業(yè)自動(dòng)化、嵌入式系統(tǒng)等領(lǐng)域廣泛應(yīng)用。
2、RS-232與RS-485在串口通信編程上有啥區(qū)別?
沒(méi)啥區(qū)別。特別是單點(diǎn)通信上是一致的。至于RS-485的多點(diǎn)通信,一般依賴于基于串口通信上的協(xié)議,如ModbusRTU。因此,無(wú)論是RS-232還是RS-485通信,通用的步驟都需要遵循:
(1)選擇合適的串口庫(kù): 使用Python中的串口庫(kù)(如PySerial)來(lái)建立串口連接。
(2)配置串口參數(shù): 包括波特率(Baud Rate)、數(shù)據(jù)位、停止位、校驗(yàn)位等。通信的兩端必須使用相同的參數(shù)配置。
(3)打開(kāi)串口連接: 使用串口庫(kù)打開(kāi)串口連接,可以指定串口名稱(例如COM1、/dev/ttyS0等)和波特率等參數(shù)。
(4)發(fā)送和接收數(shù)據(jù): 使用串口庫(kù)提供的方法發(fā)送和接收數(shù)據(jù)。發(fā)送時(shí),數(shù)據(jù)通常需要編碼為字節(jié)流;接收時(shí),接收到的字節(jié)流需要解碼為可讀的數(shù)據(jù)。
(5)關(guān)閉串口連接: 在通信結(jié)束后,記得關(guān)閉串口連接,釋放串口資源。
3、波特率、數(shù)據(jù)位、停止位、校驗(yàn)位是怎么定義的?
在串口通信中,波特率、數(shù)據(jù)位、停止位和校驗(yàn)位是用來(lái)定義數(shù)據(jù)傳輸?shù)膮?shù)。它們的具體含義如下:
(1)波特率(Baud Rate): 波特率是指每秒鐘傳送的比特?cái)?shù)(位數(shù))。它表示在單位時(shí)間內(nèi)可以傳輸多少個(gè)比特。通常用“波特(Baud)”表示,它的單位是每秒鐘的比特?cái)?shù),例如9600波特就表示每秒鐘可以傳輸9600個(gè)比特。發(fā)送和接收雙方必須使用相同的波特率設(shè)置,否則數(shù)據(jù)無(wú)法正常傳輸。
(2)數(shù)據(jù)位(Data Bits): 數(shù)據(jù)位指每個(gè)字符的位數(shù),即每個(gè)字節(jié)的位數(shù)。通常可以選擇 5、6、7 或 8 位數(shù)據(jù)。例如,8位數(shù)據(jù)表示每個(gè)字節(jié)由8個(gè)比特組成。發(fā)送和接收雙方必須使用相同的數(shù)據(jù)位設(shè)置,以保證數(shù)據(jù)的正確傳輸。
(3)停止位(Stop Bits): 停止位用于確定一個(gè)字符的傳輸結(jié)束。通常可以選擇 1 或 2 個(gè)停止位。例如,在使用1個(gè)停止位時(shí),數(shù)據(jù)位和停止位的傳輸順序是:起始位、數(shù)據(jù)位、校驗(yàn)位(如果有)、停止位。停止位的設(shè)置也需要發(fā)送和接收雙方保持一致。
(4)校驗(yàn)位(Parity Bit): 校驗(yàn)位用于檢測(cè)數(shù)據(jù)傳輸中的錯(cuò)誤。通??梢赃x擇奇校驗(yàn)(Odd)、偶校驗(yàn)(Even)、無(wú)校驗(yàn)(None)、標(biāo)記校驗(yàn)(Mark)或空格校驗(yàn)(Space)。在奇校驗(yàn)中,校驗(yàn)位被設(shè)置為確保數(shù)據(jù)位中的1的個(gè)數(shù)為奇數(shù);在偶校驗(yàn)中,校驗(yàn)位被設(shè)置為確保數(shù)據(jù)位中的1的個(gè)數(shù)為偶數(shù)。無(wú)校驗(yàn)表示不使用校驗(yàn)位。
這些參數(shù)的正確設(shè)置非常重要,它們決定了數(shù)據(jù)在串口間的傳輸方式。通常,兩個(gè)通信設(shè)備之間的串口參數(shù)必須保持一致,否則數(shù)據(jù)傳輸可能會(huì)出現(xiàn)錯(cuò)誤。
二、串口通信的python實(shí)現(xiàn)
1、一個(gè)Demo
import serial
# 打開(kāi)串口
ser = serial.Serial('COM46', 9600, timeout=1) # 'COM1'是你的串口號(hào),9600是波特率,timeout是超時(shí)時(shí)間(單位為秒)
# 向串口發(fā)送數(shù)據(jù)
ser.write(b's')
# 從串口接收數(shù)據(jù)
received_data = ser.readline()
print("Received data: ", received_data)
# 關(guān)閉串口
ser.close()在這個(gè)例子中,serial.Serial() 函數(shù)用于打開(kāi)串口。你需要指定串口號(hào)(例如'COM1'或'/dev/ttyS0'),波特率(例如9600),以及超時(shí)時(shí)間(timeout,單位為秒,表示等待串口數(shù)據(jù)的最長(zhǎng)時(shí)間)。
ser.write() 用于向串口發(fā)送數(shù)據(jù)。注意,write() 函數(shù)接受的是字節(jié)串(bytes),所以需要使用b''前綴。
ser.readline() 用于從串口接收數(shù)據(jù),直到遇到換行符(\n)為止。如果你知道接收的數(shù)據(jù)長(zhǎng)度,也可以使用 ser.read(n) 來(lái)讀取固定長(zhǎng)度的數(shù)據(jù)。
最后,ser.close() 用于關(guān)閉串口連接。
請(qǐng)根據(jù)你的具體需求修改串口號(hào)、波特率和其他參數(shù)。
2、serial.Serial都有哪些參數(shù)?
serial.Serial() 函數(shù)可以接受多個(gè)參數(shù),以下是其中一些常用的參數(shù):
(1)port: 串口號(hào),例如 'COM1' 或 '/dev/ttyS0'。
(2)baudrate: 波特率,例如 9600,表示每秒鐘傳輸9600位。
(3)timeout: 讀取超時(shí)時(shí)間,單位為秒。如果設(shè)置為None,則read() 操作會(huì)一直等待數(shù)據(jù)到達(dá);如果設(shè)置為0,read() 操作會(huì)立即返回;如果設(shè)置為一個(gè)正數(shù),read() 操作會(huì)等待指定秒數(shù),如果在這個(gè)時(shí)間內(nèi)沒(méi)有數(shù)據(jù)到達(dá),則返回空。
(4)bytesize: 數(shù)據(jù)位的位數(shù),默認(rèn)為8。
(5)parity: 校驗(yàn)位,可以是serial.PARITY_NONE(無(wú)校驗(yàn))、serial.PARITY_EVEN(偶校驗(yàn))、serial.PARITY_ODD(奇校驗(yàn))、serial.PARITY_MARK(標(biāo)記校驗(yàn))或serial.PARITY_SPACE(空格校驗(yàn))。
(6)stopbits: 停止位的位數(shù),默認(rèn)為1。
(7)xonxoff: 控制軟件流控(XON/XOFF)。
(8)rtscts: 控制硬件流控(RTS/CTS)。
(9)dsrdtr: 控制硬件流控(DSR/DTR)。
(10)write_timeout: 寫入超時(shí)時(shí)間,單位為秒。
(11)inter_byte_timeout: 字節(jié)間超時(shí)時(shí)間,單位為秒。
(12)exclusive: 如果為True,在打開(kāi)串口時(shí),將確保沒(méi)有其他程序可以打開(kāi)同一個(gè)串口。
這些參數(shù)可以根據(jù)你的具體需求進(jìn)行設(shè)置。請(qǐng)注意,不同操作系統(tǒng)(例如Windows、Linux、macOS)可能對(duì)串口號(hào)的表示方式有所不同,需要根據(jù)你的操作系統(tǒng)來(lái)設(shè)置正確的串口號(hào)。
到此這篇關(guān)于python實(shí)現(xiàn)串口通信的示例代碼的文章就介紹到這了,更多相關(guān)python 串口通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python中串口通信庫(kù)pyserial基礎(chǔ)知識(shí)
- Python讀取串口數(shù)據(jù)的實(shí)現(xiàn)方法
- python讀取串口數(shù)據(jù)有幾種方法
- python serial串口通信示例詳解
- 玩轉(zhuǎn)串口通信:利用pyserial庫(kù),Python打開(kāi)無(wú)限可能
- Python通過(guò)串口實(shí)現(xiàn)收發(fā)文件
- Python串口通信的接收與發(fā)送的實(shí)現(xiàn)
- Python?Serial串口的簡(jiǎn)單數(shù)據(jù)收發(fā)方式
- 使用Python玩轉(zhuǎn)串口(基于pySerial問(wèn)題)
- python串口讀取數(shù)據(jù)的實(shí)例
- 使用 Python 列出串口的實(shí)現(xiàn)方法
- Python中串口操作的實(shí)現(xiàn)示例
相關(guān)文章
使用Python實(shí)現(xiàn)對(duì)比兩個(gè)PDF文檔的差異
在文檔版本管理、合同審核、報(bào)告校對(duì)等場(chǎng)景中,準(zhǔn)確識(shí)別兩個(gè)?PDF?文件之間的差異是一項(xiàng)常見(jiàn)需求,本文介紹如何利用?Spire.PDF?for?Python?庫(kù),通過(guò)編程方式自動(dòng)化完成?PDF?文檔的差異對(duì)比工作,希望對(duì)大家有所幫助2026-04-04
pandas刪除重復(fù)數(shù)據(jù)簡(jiǎn)單方法
這篇文章主要給大家介紹了關(guān)于pandas刪除重復(fù)數(shù)據(jù)的簡(jiǎn)單方法,在數(shù)據(jù)處理過(guò)程中常常會(huì)遇到重復(fù)的問(wèn)題,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07
python3.7 利用函數(shù)os pandas利用excel對(duì)文件名進(jìn)行歸類
這篇文章主要介紹了python3.7 利用函數(shù)os pandas利用excel對(duì)文件名進(jìn)行歸類,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
python文件生成exe之在pycharm使用pyinstaller指令方式
在PyCharm中使用PyInstaller打包Python文件成可執(zhí)行文件(.exe)的步驟,首先,在PyCharm中安裝PyInstaller插件,然后打開(kāi)項(xiàng)目的設(shè)置,添加PyInstaller插件,接著,在終端中導(dǎo)航到Python文件所在目錄,使用pip安裝PyInstaller,最后使用命令行生成可執(zhí)行文件2026-03-03
基于python實(shí)現(xiàn)微信收紅包自動(dòng)化測(cè)試腳本(測(cè)試用例)
這篇文章主要介紹了基于python實(shí)現(xiàn)微信收紅包自動(dòng)化測(cè)試腳本,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-07-07
微信公眾號(hào)腳本-獲取熱搜自動(dòng)新建草稿并發(fā)布文章
本來(lái)想寫一個(gè)自動(dòng)化發(fā)布微信公眾號(hào)的小綠書的腳本,但是微信公眾號(hào)官網(wǎng)沒(méi)有小綠書的接口,那就寫一個(gè)獲取熱搜微信普通文章的腳本吧,這篇文章主要介紹了微信公眾號(hào)腳本-獲取熱搜自動(dòng)新建草稿并發(fā)布文章2025-04-04
Python實(shí)現(xiàn)復(fù)雜的事件驅(qū)動(dòng)架構(gòu)
事件驅(qū)動(dòng)架構(gòu)(Event-Driven?Architecture,?EDA)是一種軟件設(shè)計(jì)模式,它基于事件的產(chǎn)生、傳播和處理進(jìn)行系統(tǒng)的構(gòu)建,下面我們來(lái)看看如何在?Python?中實(shí)現(xiàn)復(fù)雜的事件驅(qū)動(dòng)架構(gòu)吧2024-12-12

