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)可能对串口号的表示方式有所不同,需要根据你的操作系统来设置正确的串口号。