python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python 串口通信

python实现串口通信的示例代码

作者:Lion King

python实现串口通信是一件简单的事情,只要通过pyserial模块就可以实现,本文主要介绍了python实现串口通信的示例代码,感兴趣的可以了解一下

python实现串口通信是一件简单的事情,只要通过pyserial模块就可以实现。

一、串口通信

1、什么是串口通信?

串口通信是一种通过串行接口(Serial Port)进行数据传输的通信方式。在串口通信中,数据位按顺序一位一位地传输,相比并行通信,串口通信只需要几根线缆就能实现数据传输。串口通信通常用于连接计算机与外部设备,例如传感器、打印机、微控制器等。串口通信主要有两种标准:RS-232和RS-485。

(1)RS-232:RS-232是一种单点通信协议,适用于连接两台设备,其中一台设备作为主设备(例如计算机),另一台设备作为从设备。RS-232使用多根线缆,包括数据线、控制线和地线。RS-232通信距离较短,通常在15米以内。

(2)RS-485:RS-485是一种多点通信协议,适用于连接多个设备。RS-485可以连接多达128个设备,其中每个设备都有独特的地址。RS-485使用两根线缆(A线和B线)进行数据传输,这种差分信号传输方式使得RS-485通信距离可以达到1200米,同时具备抗干扰能力。

串口通信通常以串行数据的形式传输,其中数据位逐位传输,通信的两端使用同样的波特率、数据位、停止位和校验位等参数,以确保正确的数据传输。串口通信在工业自动化、嵌入式系统等领域广泛应用。

2、RS-232与RS-485在串口通信编程上有啥区别?

没啥区别。特别是单点通信上是一致的。至于RS-485的多点通信,一般依赖于基于串口通信上的协议,如ModbusRTU。因此,无论是RS-232还是RS-485通信,通用的步骤都需要遵循:

(1)选择合适的串口库: 使用Python中的串口库(如PySerial)来建立串口连接。

(2)配置串口参数: 包括波特率(Baud Rate)、数据位、停止位、校验位等。通信的两端必须使用相同的参数配置。

(3)打开串口连接: 使用串口库打开串口连接,可以指定串口名称(例如COM1、/dev/ttyS0等)和波特率等参数。

(4)发送和接收数据: 使用串口库提供的方法发送和接收数据。发送时,数据通常需要编码为字节流;接收时,接收到的字节流需要解码为可读的数据。

(5)关闭串口连接: 在通信结束后,记得关闭串口连接,释放串口资源。

3、波特率、数据位、停止位、校验位是怎么定义的?

在串口通信中,波特率、数据位、停止位和校验位是用来定义数据传输的参数。它们的具体含义如下:

(1)波特率(Baud Rate): 波特率是指每秒钟传送的比特数(位数)。它表示在单位时间内可以传输多少个比特。通常用“波特(Baud)”表示,它的单位是每秒钟的比特数,例如9600波特就表示每秒钟可以传输9600个比特。发送和接收双方必须使用相同的波特率设置,否则数据无法正常传输。

(2)数据位(Data Bits): 数据位指每个字符的位数,即每个字节的位数。通常可以选择 5、6、7 或 8 位数据。例如,8位数据表示每个字节由8个比特组成。发送和接收双方必须使用相同的数据位设置,以保证数据的正确传输。

(3)停止位(Stop Bits): 停止位用于确定一个字符的传输结束。通常可以选择 1 或 2 个停止位。例如,在使用1个停止位时,数据位和停止位的传输顺序是:起始位、数据位、校验位(如果有)、停止位。停止位的设置也需要发送和接收双方保持一致。

(4)校验位(Parity Bit): 校验位用于检测数据传输中的错误。通常可以选择奇校验(Odd)、偶校验(Even)、无校验(None)、标记校验(Mark)或空格校验(Space)。在奇校验中,校验位被设置为确保数据位中的1的个数为奇数;在偶校验中,校验位被设置为确保数据位中的1的个数为偶数。无校验表示不使用校验位。

这些参数的正确设置非常重要,它们决定了数据在串口间的传输方式。通常,两个通信设备之间的串口参数必须保持一致,否则数据传输可能会出现错误。

二、串口通信的python实现

1、一个Demo

import serial

# 打开串口
ser = serial.Serial('COM46', 9600, timeout=1)  # 'COM1'是你的串口号,9600是波特率,timeout是超时时间(单位为秒)
# 向串口发送数据
ser.write(b's')
# 从串口接收数据
received_data = ser.readline()
print("Received data: ", received_data)
# 关闭串口
ser.close()

在这个例子中,serial.Serial() 函数用于打开串口。你需要指定串口号(例如'COM1''/dev/ttyS0'),波特率(例如9600),以及超时时间(timeout,单位为秒,表示等待串口数据的最长时间)。

ser.write() 用于向串口发送数据。注意,write() 函数接受的是字节串(bytes),所以需要使用b''前缀。

ser.readline() 用于从串口接收数据,直到遇到换行符(\n)为止。如果你知道接收的数据长度,也可以使用 ser.read(n) 来读取固定长度的数据。

最后,ser.close() 用于关闭串口连接。

请根据你的具体需求修改串口号、波特率和其他参数。

2、serial.Serial都有哪些参数?

serial.Serial() 函数可以接受多个参数,以下是其中一些常用的参数:

(1)port: 串口号,例如 'COM1' 或 '/dev/ttyS0'

(2)baudrate: 波特率,例如 9600,表示每秒钟传输9600位。

(3)timeout: 读取超时时间,单位为秒。如果设置为None,则read() 操作会一直等待数据到达;如果设置为0,read() 操作会立即返回;如果设置为一个正数,read() 操作会等待指定秒数,如果在这个时间内没有数据到达,则返回空。

(4)bytesize: 数据位的位数,默认为8。

(5)parity: 校验位,可以是serial.PARITY_NONE(无校验)、serial.PARITY_EVEN(偶校验)、serial.PARITY_ODD(奇校验)、serial.PARITY_MARK(标记校验)或serial.PARITY_SPACE(空格校验)。

(6)stopbits: 停止位的位数,默认为1。

(7)xonxoff: 控制软件流控(XON/XOFF)。

(8)rtscts: 控制硬件流控(RTS/CTS)。

(9)dsrdtr: 控制硬件流控(DSR/DTR)。

(10)write_timeout: 写入超时时间,单位为秒。

(11)inter_byte_timeout: 字节间超时时间,单位为秒。

(12)exclusive: 如果为True,在打开串口时,将确保没有其他程序可以打开同一个串口。

这些参数可以根据你的具体需求进行设置。请注意,不同操作系统(例如Windows、Linux、macOS)可能对串口号的表示方式有所不同,需要根据你的操作系统来设置正确的串口号。

到此这篇关于python实现串口通信的示例代码的文章就介绍到这了,更多相关python 串口通信内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文