pySerial -- Python的串口通讯模块

本文介绍了pySerial模块,它用于封装串口通讯功能,在多种操作系统上提供一致的接口。支持Linux、Windows及BSD等系统,并兼容Jython和IconPython。文章详细讲解了其安装方式、常用方法及属性设置等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pySerial

介绍

封装了串口通讯模块,支持Linux、Windows、BSD(可能支持所有支持POSIX的操作系统),支持Jython(Java)和IconPython(.NET and Mono).

首页 http://pyserial.sf.net/

特性

  • 所有平台使用同样的类接口
  • 端口号默认从0开始,程序中不需要知道端口名称
  • 像文件读写一样的API,readwritereadline等也受支持)
  • 所有程序全由Python完成,除了标准库外不依赖其他包,除了pywin32(windows)、JavaComm(Jython). POSIX(Linux, BSD) 只依赖Python标准库。

依赖环境

  • Python2.2或更新版本
  • windows 上的 pywin32扩展
  • Java/Jython上的 "Java Communications" (JavaComm)或者兼容包

安装

pip/easy_install

pip install pyserial 

easy_install pyserial 

windows

下载地址 : http://sourceforge.net/project/showfiles.php?group_id=46487

快速上手

Open port 0 at "9600,8,N,1", no timeout

>>> import serial  
>>> ser = serial.Serial(0)  # open first serial port  
>>> print ser.portstr       # check which port was really used  
>>> ser.write("hello")      # write a string  
>>> ser.close()             # close port 

Open named port at "19200,8,N,1", 1s timeout

>>> ser = serial.Serial('/dev/ttyS1', 19200, timeout=1)  
>>> x = ser.read()          # read one byte  
>>> s = ser.read(10)        # read up to ten bytes (timeout)  
>>> line = ser.readline()   # read a '/n' terminated line  
>>> ser.close()  

Open second port at "38400,8,E,1", non blocking HW handshaking

>>> ser = serial.Serial(1, 38400, timeout=0,  
...                     parity=serial.PARITY_EVEN, rtscts=1)  
>>> s = ser.read(100)       # read up to one hundred bytes  
...                         # or as much is in the buffer  

Get a Serial instance and configure/open it later

>>> ser = serial.Serial()  
>>> ser.baudrate = 19200  
>>> ser.port = 0  
>>> ser  
Serial<id=0xa81c10, open=False>(port='COM1', baudrate=19200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=0, rtscts=0)  
>>> ser.open()  
>>> ser.isOpen()  
True  
>>> ser.close()  
>>> ser.isOpen()  
False  

如果给定端口,端口将在创建对象之后立即打开,如果没有给定端口,可选timeout参数

timeout=None            # wait forever  
timeout=0               # non-blocking mode (return immediately on read)  
timeout=x               # set timeout to x seconds (float allowed)  

Serial实例的可用方法

open()                  # 打开端口
close()                 # 立即关闭端口  
setBaudrate(baudrate)   # change baud rate on an open port  
inWaiting()             # return the number of chars in the receive buffer  
read(size=1)            # read "size" characters  
write(s)                # 把字符串s写到该端口  
flushInput()            # 清除输入缓存区,放弃所有内容
flushOutput()           # 清除输出缓冲区,放弃输出  
sendBreak()             # 发送中断条件  
setRTS(level=1)         # set RTS line to specified logic level  
setDTR(level=1)         # set DTR line to specified logic level  
getCTS()                # return the state of the CTS line  
getDSR()                # return the state of the DSR line  
getRI()                 # return the state of the RI line  
getCD()                 # return the state of the CD line

Serial实例的属性

只读

portstr                 # 设备名称  
BAUDRATES               # list of valid baudrates  
BYTESIZES               # list of valid byte sizes  
PARITIES                # list of valid parities  
STOPBITS                # list of valid stop bit widths  

下面属性值被更改后端口会重新配置,即使端口已经打开

port                    # port name/number as set by the user  
baudrate                # current baud rate setting  
bytesize                # byte size in bits  
parity                  # parity setting  
stopbits                # stop bit with (1,2)  
timeout                 # timeout setting  
xonxoff                 # if Xon/Xoff flow control is enabled  
rtscts                  # if hardware flow control is enabled  

异常

serial.SerialException  

常量

parity:

serial.PARITY_NONE  
serial.PARITY_EVEN  
serial.PARITY_ODD  

stopbits

serial.STOPBITS_ONE  
al.STOPBITS_TWO 

bytesize:

serial.FIVEBITS  
serial.SIXBITS  
serial.SEVENBITS  
serial.EIGHTBITS  

翻译(有删减)仅供参考

原文地址:http://blog.csdn.net/dainiao01/article/details/5885122
官方文档:http://pyserial.sf.net/

要实现上位机与台达DVP-SS2 PLC的串口通信,需确保硬件连接和软件配置正确。以下是实现方法: ### 硬件连接 1. **串口类型**:上位机通常配备RS232串口,而台达DVP-SS2 PLC使用RS485端口。由于RS232和RS485的电气特性不同,因此需要使用RS232转RS485转换模块来实现通信[^2]。 2. **连接方式**:将RS232转RS485转换模块连接到上位机的RS232串口,另一端连接到台达DVP-SS2 PLC的RS485端口。 ### 软件配置 1. **串口参数设置**:上位机和PLC的串口参数必须一致。通常的设置为波特率9600,数据位8,停止位1,无校验(即9600, 8, n, 1)[^2]。 2. **通信协议**:使用标准的Modbus-RTU协议进行通信。上位机作为主站,PLC作为从站,可以通过Modbus-RTU协议读取PLC的状态(如X, Y状态),设置Y的状态,读取D寄存器的值等。 ### 调试过程 1. **参数一致性**:确保上位机串口调试软件和PLC的通讯格式设置一致,包括波特率、数据位、停止位和校验方式。 2. **端口定义**:确认PLC使用的串口为COM2,并通过软件设置为RS485端口[^2]。 ### 示例代码 以下是一个简单的Python示例,展示如何使用`pyserial`库与台达DVP-SS2 PLC进行串口通信: ```python import serial # 配置串口参数 ser = serial.Serial( port='COM1', # 上位机串口名称 baudrate=9600, # 波特率 bytesize=8, # 数据位 parity='N', # 校验位 stopbits=1 # 停止位 ) # 发送Modbus-RTU请求 def send_modbus_request(slave_id, function_code, register_address, quantity): # 构造Modbus-RTU请求报文 request = bytearray([slave_id, function_code, register_address >> 8, register_address & 0xFF, quantity >> 8, quantity & 0xFF]) # 添加CRC校验 crc = calculate_crc(request) request += crc # 发送请求 ser.write(request) # 计算CRC校验码 def calculate_crc(data): crc = 0xFFFF for pos in data: crc ^= pos for _ in range(8): if (crc & 1) != 0: crc >>= 1 crc ^= 0xA001 else: crc >>= 1 return crc.to_bytes(2, byteorder='little') # 读取PLC寄存器值 def read_plc_register(): send_modbus_request(slave_id=1, function_code=3, register_address=0x0000, quantity=1) response = ser.read(5) # 读取响应 print("Response:", response) read_plc_register() ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值