精华内容
下载资源
问答
  • pyserial pyserial pyserial pyserial pyserial pyserial pyserial pyserial pyserial pyserial pyserial pyserial pyserial pyserial pyserial pyserial pyserial pyserial
  • pySerial Overview This module encapsulates the access for the serial port. It provides backends for Python running on Windows, OSX, Linux, BSD (possibly any POSIX compliant system) and IronPython. ...
  • Pyserial-Demo

    2021-05-11 14:01:02
    Pyserial-Demo 一个简单的串口工具
  • pyserial异步 用于OSX,Linux,BSD的Python串行端口扩展的异步I / O扩展包 它取决于pySerial,并且与Python 3.5及更高版本兼容。 文献资料 文档: : 下载页面: : 项目主页: :
  • Pyserial安装

    2020-09-29 09:58:15
    Pyserial安装 把pyserial安装包解压到Python安装路径 使用cmd到pyserial目录下 执行python setup.py build 再执行python setup.py install 打开Python GUI, 输入import serial, 若没有报错,代表安装成功

    Pyserial安装

    1. 把pyserial安装包解压到Python安装路径
    2. 使用cmd到pyserial目录下
    3. 执行python setup.py build
    4. 再执行python setup.py install
    5. 打开Python GUI, 输入import serial, 若没有报错,代表安装成功
    展开全文
  • Python3+PyQT5+Pyserial 实现简单的串口工具

    万次阅读 多人点赞 2018-04-19 11:04:00
    练手项目,先上图 先实现一个简单的串口工具...pyserial_demo.py import sys import serial import serial.tools.list_ports from PyQt5 import QtWidgets from PyQt5.QtWidgets import QMessageBox f...

    练手项目,先上图
    这里写图片描述
    先实现一个简单的串口工具,为之后的上位机做准备
    代码如下:

    代码 github 地址: https://github.com/ColinFred/Pyserial-Demo

    pyserial_demo.py

    import sys
    import serial
    import serial.tools.list_ports
    from PyQt5 import QtWidgets
    from PyQt5.QtWidgets import QMessageBox
    from PyQt5.QtCore import QTimer
    from ui_demo_1 import Ui_Form
    
    
    class Pyqt5_Serial(QtWidgets.QWidget, Ui_Form):
        def __init__(self):
            super(Pyqt5_Serial, self).__init__()
            self.setupUi(self)
            self.init()
            self.setWindowTitle("串口小助手")
            self.ser = serial.Serial()
            self.port_check()
    
            # 接收数据和发送数据数目置零
            self.data_num_received = 0
            self.lineEdit.setText(str(self.data_num_received))
            self.data_num_sended = 0
            self.lineEdit_2.setText(str(self.data_num_sended))
    
        def init(self):
            # 串口检测按钮
            self.s1__box_1.clicked.connect(self.port_check)
    
            # 串口信息显示
            self.s1__box_2.currentTextChanged.connect(self.port_imf)
    
            # 打开串口按钮
            self.open_button.clicked.connect(self.port_open)
    
            # 关闭串口按钮
            self.close_button.clicked.connect(self.port_close)
    
            # 发送数据按钮
            self.s3__send_button.clicked.connect(self.data_send)
    
            # 定时发送数据
            self.timer_send = QTimer()
            self.timer_send.timeout.connect(self.data_send)
            self.timer_send_cb.stateChanged.connect(self.data_send_timer)
    
            # 定时器接收数据
            self.timer = QTimer(self)
            self.timer.timeout.connect(self.data_receive)
    
            # 清除发送窗口
            self.s3__clear_button.clicked.connect(self.send_data_clear)
    
            # 清除接收窗口
            self.s2__clear_button.clicked.connect(self.receive_data_clear)
    
        # 串口检测
        def port_check(self):
            # 检测所有存在的串口,将信息存储在字典中
            self.Com_Dict = {}
            port_list = list(serial.tools.list_ports.comports())
            self.s1__box_2.clear()
            for port in port_list:
                self.Com_Dict["%s" % port[0]] = "%s" % port[1]
                self.s1__box_2.addItem(port[0])
            if len(self.Com_Dict) == 0:
                self.state_label.setText(" 无串口")
    
        # 串口信息
        def port_imf(self):
            # 显示选定的串口的详细信息
            imf_s = self.s1__box_2.currentText()
            if imf_s != "":
                self.state_label.setText(self.Com_Dict[self.s1__box_2.currentText()])
    
        # 打开串口
        def port_open(self):
            self.ser.port = self.s1__box_2.currentText()
            self.ser.baudrate = int(self.s1__box_3.currentText())
            self.ser.bytesize = int(self.s1__box_4.currentText())
            self.ser.stopbits = int(self.s1__box_6.currentText())
            self.ser.parity = self.s1__box_5.currentText()
    
            try:
                self.ser.open()
            except:
                QMessageBox.critical(self, "Port Error", "此串口不能被打开!")
                return None
    
            # 打开串口接收定时器,周期为2ms
            self.timer.start(2)
    
            if self.ser.isOpen():
                self.open_button.setEnabled(False)
                self.close_button.setEnabled(True)
                self.formGroupBox1.setTitle("串口状态(已开启)")
    
        # 关闭串口
        def port_close(self):
            self.timer.stop()
            self.timer_send.stop()
            try:
                self.ser.close()
            except:
                pass
            self.open_button.setEnabled(True)
            self.close_button.setEnabled(False)
            self.lineEdit_3.setEnabled(True)
            # 接收数据和发送数据数目置零
            self.data_num_received = 0
            self.lineEdit.setText(str(self.data_num_received))
            self.data_num_sended = 0
            self.lineEdit_2.setText(str(self.data_num_sended))
            self.formGroupBox1.setTitle("串口状态(已关闭)")
    
        # 发送数据
        def data_send(self):
            if self.ser.isOpen():
                input_s = self.s3__send_text.toPlainText()
                if input_s != "":
                    # 非空字符串
                    if self.hex_send.isChecked():
                        # hex发送
                        input_s = input_s.strip()
                        send_list = []
                        while input_s != '':
                            try:
                                num = int(input_s[0:2], 16)
                            except ValueError:
                                QMessageBox.critical(self, 'wrong data', '请输入十六进制数据,以空格分开!')
                                return None
                            input_s = input_s[2:].strip()
                            send_list.append(num)
                        input_s = bytes(send_list)
                    else:
                        # ascii发送
                        input_s = (input_s + '\r\n').encode('utf-8')
    
                    num = self.ser.write(input_s)
                    self.data_num_sended += num
                    self.lineEdit_2.setText(str(self.data_num_sended))
            else:
                pass
    
        # 接收数据
        def data_receive(self):
            try:
                num = self.ser.inWaiting()
            except:
                self.port_close()
                return None
            if num > 0:
                data = self.ser.read(num)
                num = len(data)
                # hex显示
                if self.hex_receive.checkState():
                    out_s = ''
                    for i in range(0, len(data)):
                        out_s = out_s + '{:02X}'.format(data[i]) + ' '
                    self.s2__receive_text.insertPlainText(out_s)
                else:
                    # 串口接收到的字符串为b'123',要转化成unicode字符串才能输出到窗口中去
                    self.s2__receive_text.insertPlainText(data.decode('utf-8'))
    
                # 统计接收字符的数量
                self.data_num_received += num
                self.lineEdit.setText(str(self.data_num_received))
    
                # 获取到text光标
                textCursor = self.s2__receive_text.textCursor()
                # 滚动到底部
                textCursor.movePosition(textCursor.End)
                # 设置光标到text中去
                self.s2__receive_text.setTextCursor(textCursor)
            else:
                pass
    
        # 定时发送数据
        def data_send_timer(self):
            if self.timer_send_cb.isChecked():
                self.timer_send.start(int(self.lineEdit_3.text()))
                self.lineEdit_3.setEnabled(False)
            else:
                self.timer_send.stop()
                self.lineEdit_3.setEnabled(True)
    
        # 清除显示
        def send_data_clear(self):
            self.s3__send_text.setText("")
    
        def receive_data_clear(self):
            self.s2__receive_text.setText("")
    
    
    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)
        myshow = Pyqt5_Serial()
        myshow.show()
        sys.exit(app.exec_())
    
    

    ui_demo_1.py

    # -*- coding: utf-8 -*-
    
    # Form implementation generated from reading ui file 'demo_1.ui'
    #
    # Created by: PyQt5 UI code generator 5.6
    #
    # WARNING! All changes made in this file will be lost!
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    class Ui_Form(object):
        def setupUi(self, Form):
            Form.setObjectName("Form")
            Form.resize(707, 458)
            self.formGroupBox = QtWidgets.QGroupBox(Form)
            self.formGroupBox.setGeometry(QtCore.QRect(20, 20, 167, 301))
            self.formGroupBox.setObjectName("formGroupBox")
            self.formLayout = QtWidgets.QFormLayout(self.formGroupBox)
            self.formLayout.setContentsMargins(10, 10, 10, 10)
            self.formLayout.setSpacing(10)
            self.formLayout.setObjectName("formLayout")
            self.s1__lb_1 = QtWidgets.QLabel(self.formGroupBox)
            self.s1__lb_1.setObjectName("s1__lb_1")
            self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.s1__lb_1)
            self.s1__box_1 = QtWidgets.QPushButton(self.formGroupBox)
            self.s1__box_1.setAutoRepeatInterval(100)
            self.s1__box_1.setDefault(True)
            self.s1__box_1.setObjectName("s1__box_1")
            self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.s1__box_1)
            self.s1__lb_2 = QtWidgets.QLabel(self.formGroupBox)
            self.s1__lb_2.setObjectName("s1__lb_2")
            self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.s1__lb_2)
            self.s1__box_2 = QtWidgets.QComboBox(self.formGroupBox)
            self.s1__box_2.setObjectName("s1__box_2")
            self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.s1__box_2)
            self.s1__lb_3 = QtWidgets.QLabel(self.formGroupBox)
            self.s1__lb_3.setObjectName("s1__lb_3")
            self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.s1__lb_3)
            self.s1__box_3 = QtWidgets.QComboBox(self.formGroupBox)
            self.s1__box_3.setObjectName("s1__box_3")
            self.s1__box_3.addItem("")
            self.s1__box_3.addItem("")
            self.s1__box_3.addItem("")
            self.s1__box_3.addItem("")
            self.s1__box_3.addItem("")
            self.s1__box_3.addItem("")
            self.s1__box_3.addItem("")
            self.s1__box_3.addItem("")
            self.s1__box_3.addItem("")
            self.s1__box_3.addItem("")
            self.s1__box_3.addItem("")
            self.s1__box_3.addItem("")
            self.formLayout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.s1__box_3)
            self.s1__lb_4 = QtWidgets.QLabel(self.formGroupBox)
            self.s1__lb_4.setObjectName("s1__lb_4")
            self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.s1__lb_4)
            self.s1__box_4 = QtWidgets.QComboBox(self.formGroupBox)
            self.s1__box_4.setObjectName("s1__box_4")
            self.s1__box_4.addItem("")
            self.s1__box_4.addItem("")
            self.s1__box_4.addItem("")
            self.s1__box_4.addItem("")
            self.formLayout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.s1__box_4)
            self.s1__lb_5 = QtWidgets.QLabel(self.formGroupBox)
            self.s1__lb_5.setObjectName("s1__lb_5")
            self.formLayout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.s1__lb_5)
            self.s1__box_5 = QtWidgets.QComboBox(self.formGroupBox)
            self.s1__box_5.setObjectName("s1__box_5")
            self.s1__box_5.addItem("")
            self.formLayout.setWidget(5, QtWidgets.QFormLayout.FieldRole, self.s1__box_5)
            self.open_button = QtWidgets.QPushButton(self.formGroupBox)
            self.open_button.setObjectName("open_button")
            self.formLayout.setWidget(7, QtWidgets.QFormLayout.SpanningRole, self.open_button)
            self.close_button = QtWidgets.QPushButton(self.formGroupBox)
            self.close_button.setObjectName("close_button")
            self.formLayout.setWidget(8, QtWidgets.QFormLayout.SpanningRole, self.close_button)
            self.s1__lb_6 = QtWidgets.QLabel(self.formGroupBox)
            self.s1__lb_6.setObjectName("s1__lb_6")
            self.formLayout.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.s1__lb_6)
            self.s1__box_6 = QtWidgets.QComboBox(self.formGroupBox)
            self.s1__box_6.setObjectName("s1__box_6")
            self.s1__box_6.addItem("")
            self.formLayout.setWidget(6, QtWidgets.QFormLayout.FieldRole, self.s1__box_6)
            self.state_label = QtWidgets.QLabel(self.formGroupBox)
            self.state_label.setText("")
            self.state_label.setTextFormat(QtCore.Qt.AutoText)
            self.state_label.setScaledContents(True)
            self.state_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
            self.state_label.setObjectName("state_label")
            self.formLayout.setWidget(2, QtWidgets.QFormLayout.SpanningRole, self.state_label)
            self.verticalGroupBox = QtWidgets.QGroupBox(Form)
            self.verticalGroupBox.setGeometry(QtCore.QRect(210, 20, 401, 241))
            self.verticalGroupBox.setObjectName("verticalGroupBox")
            self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalGroupBox)
            self.verticalLayout.setContentsMargins(10, 10, 10, 10)
            self.verticalLayout.setObjectName("verticalLayout")
            self.s2__receive_text = QtWidgets.QTextBrowser(self.verticalGroupBox)
            self.s2__receive_text.setObjectName("s2__receive_text")
            self.verticalLayout.addWidget(self.s2__receive_text)
            self.verticalGroupBox_2 = QtWidgets.QGroupBox(Form)
            self.verticalGroupBox_2.setGeometry(QtCore.QRect(210, 280, 401, 101))
            self.verticalGroupBox_2.setObjectName("verticalGroupBox_2")
            self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.verticalGroupBox_2)
            self.verticalLayout_2.setContentsMargins(10, 10, 10, 10)
            self.verticalLayout_2.setObjectName("verticalLayout_2")
            self.s3__send_text = QtWidgets.QTextEdit(self.verticalGroupBox_2)
            self.s3__send_text.setObjectName("s3__send_text")
            self.verticalLayout_2.addWidget(self.s3__send_text)
            self.s3__send_button = QtWidgets.QPushButton(Form)
            self.s3__send_button.setGeometry(QtCore.QRect(620, 310, 61, 31))
            self.s3__send_button.setObjectName("s3__send_button")
            self.s3__clear_button = QtWidgets.QPushButton(Form)
            self.s3__clear_button.setGeometry(QtCore.QRect(620, 350, 61, 31))
            self.s3__clear_button.setObjectName("s3__clear_button")
            self.formGroupBox1 = QtWidgets.QGroupBox(Form)
            self.formGroupBox1.setGeometry(QtCore.QRect(20, 340, 171, 101))
            self.formGroupBox1.setObjectName("formGroupBox1")
            self.formLayout_2 = QtWidgets.QFormLayout(self.formGroupBox1)
            self.formLayout_2.setContentsMargins(10, 10, 10, 10)
            self.formLayout_2.setSpacing(10)
            self.formLayout_2.setObjectName("formLayout_2")
            self.label = QtWidgets.QLabel(self.formGroupBox1)
            self.label.setObjectName("label")
            self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label)
            self.label_2 = QtWidgets.QLabel(self.formGroupBox1)
            self.label_2.setObjectName("label_2")
            self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_2)
            self.lineEdit = QtWidgets.QLineEdit(self.formGroupBox1)
            self.lineEdit.setObjectName("lineEdit")
            self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.lineEdit)
            self.lineEdit_2 = QtWidgets.QLineEdit(self.formGroupBox1)
            self.lineEdit_2.setObjectName("lineEdit_2")
            self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.lineEdit_2)
            self.hex_send = QtWidgets.QCheckBox(Form)
            self.hex_send.setGeometry(QtCore.QRect(620, 280, 71, 16))
            self.hex_send.setObjectName("hex_send")
            self.hex_receive = QtWidgets.QCheckBox(Form)
            self.hex_receive.setGeometry(QtCore.QRect(620, 40, 71, 16))
            self.hex_receive.setObjectName("hex_receive")
            self.s2__clear_button = QtWidgets.QPushButton(Form)
            self.s2__clear_button.setGeometry(QtCore.QRect(620, 80, 61, 31))
            self.s2__clear_button.setObjectName("s2__clear_button")
            self.timer_send_cb = QtWidgets.QCheckBox(Form)
            self.timer_send_cb.setGeometry(QtCore.QRect(260, 390, 71, 16))
            self.timer_send_cb.setObjectName("timer_send_cb")
            self.lineEdit_3 = QtWidgets.QLineEdit(Form)
            self.lineEdit_3.setGeometry(QtCore.QRect(350, 390, 61, 20))
            self.lineEdit_3.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
            self.lineEdit_3.setObjectName("lineEdit_3")
            self.dw = QtWidgets.QLabel(Form)
            self.dw.setGeometry(QtCore.QRect(420, 390, 54, 20))
            self.dw.setObjectName("dw")
            self.verticalGroupBox.raise_()
            self.verticalGroupBox_2.raise_()
            self.formGroupBox.raise_()
            self.s3__send_button.raise_()
            self.s3__clear_button.raise_()
            self.formGroupBox.raise_()
            self.hex_send.raise_()
            self.hex_receive.raise_()
            self.s2__clear_button.raise_()
            self.timer_send_cb.raise_()
            self.lineEdit_3.raise_()
            self.dw.raise_()
    
            self.retranslateUi(Form)
            QtCore.QMetaObject.connectSlotsByName(Form)
    
        def retranslateUi(self, Form):
            _translate = QtCore.QCoreApplication.translate
            Form.setWindowTitle(_translate("Form", "Form"))
            self.formGroupBox.setTitle(_translate("Form", "串口设置"))
            self.s1__lb_1.setText(_translate("Form", "串口检测:"))
            self.s1__box_1.setText(_translate("Form", "检测串口"))
            self.s1__lb_2.setText(_translate("Form", "串口选择:"))
            self.s1__lb_3.setText(_translate("Form", "波特率:"))
            self.s1__box_3.setItemText(0, _translate("Form", "115200"))
            self.s1__box_3.setItemText(1, _translate("Form", "2400"))
            self.s1__box_3.setItemText(2, _translate("Form", "4800"))
            self.s1__box_3.setItemText(3, _translate("Form", "9600"))
            self.s1__box_3.setItemText(4, _translate("Form", "14400"))
            self.s1__box_3.setItemText(5, _translate("Form", "19200"))
            self.s1__box_3.setItemText(6, _translate("Form", "38400"))
            self.s1__box_3.setItemText(7, _translate("Form", "57600"))
            self.s1__box_3.setItemText(8, _translate("Form", "76800"))
            self.s1__box_3.setItemText(9, _translate("Form", "12800"))
            self.s1__box_3.setItemText(10, _translate("Form", "230400"))
            self.s1__box_3.setItemText(11, _translate("Form", "460800"))
            self.s1__lb_4.setText(_translate("Form", "数据位:"))
            self.s1__box_4.setItemText(0, _translate("Form", "8"))
            self.s1__box_4.setItemText(1, _translate("Form", "7"))
            self.s1__box_4.setItemText(2, _translate("Form", "6"))
            self.s1__box_4.setItemText(3, _translate("Form", "5"))
            self.s1__lb_5.setText(_translate("Form", "校验位:"))
            self.s1__box_5.setItemText(0, _translate("Form", "N"))
            self.open_button.setText(_translate("Form", "打开串口"))
            self.close_button.setText(_translate("Form", "关闭串口"))
            self.s1__lb_6.setText(_translate("Form", "停止位:"))
            self.s1__box_6.setItemText(0, _translate("Form", "1"))
            self.verticalGroupBox.setTitle(_translate("Form", "接受区"))
            self.verticalGroupBox_2.setTitle(_translate("Form", "发送区"))
            self.s3__send_text.setHtml(_translate("Form", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
    "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
    "p, li { white-space: pre-wrap; }\n"
    "</style></head><body style=\" font-family:\'SimSun\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
    "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">123456</p></body></html>"))
            self.s3__send_button.setText(_translate("Form", "发送"))
            self.s3__clear_button.setText(_translate("Form", "清除"))
            self.formGroupBox1.setTitle(_translate("Form", "串口状态"))
            self.label.setText(_translate("Form", "已接收:"))
            self.label_2.setText(_translate("Form", "已发送:"))
            self.hex_send.setText(_translate("Form", "Hex发送"))
            self.hex_receive.setText(_translate("Form", "Hex接收"))
            self.s2__clear_button.setText(_translate("Form", "清除"))
            self.timer_send_cb.setText(_translate("Form", "定时发送"))
            self.lineEdit_3.setText(_translate("Form", "1000"))
            self.dw.setText(_translate("Form", "ms/次"))
    
    
    展开全文
  • pyserial-2.7

    2016-01-09 22:42:05
    pyserial-2.7 python 串口库支持
  • Py之pyserial:Python的pyserial库的简介、安装、使用方法之详细攻略 目录 pyserial库的简介 pyserial库的安装 pyserial库的使用方法 pyserial库的简介 pySerial 封装了串口通讯模块,支持Linux、...

    Py之pyserial:Python的pyserial库的简介、安装、使用方法之详细攻略

     

    目录

    pyserial库的简介

    pyserial库的安装

    pyserial库的使用方法


     

     

    pyserial库的简介

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

         该模块封装了串口的访问权限。它为Python在Windows、OSX、Linux、BSD(可能是任何POSIX兼容系统)和IrPython上运行提供后端。名为“Stand”

    展开全文
  • Pyserial-Demo 一个简单的串口工具
  • pyserial_patch

    2018-11-21 17:37:14
    pyserial_patch,python serial patch,Python串口补丁。
  • PySerial2.6 手册

    2013-09-28 18:11:02
    PySerial2.6 官方文档
  • pyserial, 我们的pyserial工作版本 我们正在改进串口检测 ========== pySerial 概述这里模块封装串行端口的访问。 它为在 Windows 。Linux 。BSD ( 可能任何符合POSIX的系统) 。Jython和 IronPython (.NET 和Mono上...
  • pyserial安装软件

    2015-06-07 09:40:11
    pySerial 是 Python 用来开发串口应用程序的工具包,支持多平台。
  • 参考链接: Welcome to pySerial’s documentation — pySerial 3.4 documentation ...目录pyserial和serial的区别pyserial库示例常见pySerial APIserial.Serial()open()close()__ del __()write(dat

    参考链接:

    1. Welcome to pySerial’s documentation — pySerial 3.4 documentation
    2. GitHub - pyserial/pyserial: Python serial port access library

    API详细内容参见链接1。
    链接2 is part of pySerial.

    pyserial和serial的区别

    准确的区别不清楚,但可以说明,python3版本以上涉及串行端口访问的应用均使用pyserial库,不需要serial库。
    不过在python程序中,要import serial。但实际上settings中不安装serial,只需pyserial。(实践可知)
    参见python用pyserial读取串口问题解决_Electrical_IT的博客-CSDN博客 https://blog.csdn.net/Electrical_IT/article/details/107221567
    (欢迎在留言区指正 ! )

    pyserial库

    This module encapsulates the access for the serial port. It provides backends for Python running on Windows, OSX, Linux, BSD (possibly any POSIX compliant system) and IronPython. The module named “serial” automatically selects the appropriate backend.
    该模块封装了对串行端口的访问。 它提供了在Windows,OSX,Linux,BSD(可能是任何POSIX兼容系统)和IronPython上运行的Python的后端。 名为“串行”的模块会自动选择适当的后端。

    安装:
    在Windows的cmd命令中输入 ‘pip install pyserial’,即可安装pyserial。
    或者
    在conda运行:‘conda install -c conda-forge pyserial’
    适用于linux, mac 和windows系统.

    示例

    官方示例

    The port is opened automatically:
    (Changed in version 3.4: the port is automatically opened)

    >>> port = serial.Serial()
    >>> port.port = '...'
    >>> with port as s:
    ...     s.write(b'hello')
    

    打开串口示例

    除此示例外,其他示例省略import serial、ser定义和close()等必要程序,请自行补全,灵活使用。

    import serial // 安装pyserial,但import serial,且不能安装serial
    
    # ser为串口对象,后续调用均用点运算符
    ser = serial.Serial('COM7', 3000000, 8, 'N', 1) # 'COM7', 3000000, bytesize=8, parity='N', stopbits=1
    flag = ser.is_open
    
    if flag:
    	print('success\n')
    	ser.close()
    else:
    	print('Open Error\n')
    

    写入串口示例

    向串口ser写入help字符串:

    ser.write("help".encode('utf-8'))
    

    注意,字符串要编码成utf-8,否则会报错,详细参考下文中的write(data)说明。

    读取串口示例

    读取串口4个字节的数据:

    print(ser.read(4))
    

    发送串口命令示例

    发送命令help:

    command = "help\n"   # 命令要加\n,否则识别为普通字符串
    ser.write(command.encode('utf-8'))   # 命令也同样要编码
    

    常见pySerial API(Native ports)


    serial.Serial()

    class serial.Serial __init __(port=None, baudrate=9600, bytesize=EIGHTBITS, parity=PARITY_NONE, stopbits=STOPBITS_ONE, timeout=None, xonxoff=False, rtscts=False, write_timeout=None, dsrdtr=False, inter_byte_timeout=None, exclusive=None)

    • Parameters:
      port – Device name or None.
      baudrate (int) – Baud rate such as 9600 or 115200 etc.
      bytesize – Number of data bits. Possible values: FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS
      parity – Enable parity checking. Possible values: PARITY_NONE, PARITY_EVEN, PARITY_ODD PARITY_MARK, PARITY_SPACE
      stopbits – Number of stop bits. Possible values: STOPBITS_ONE, STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO
      timeout (float) – Set a read timeout value.
      xonxoff (bool) – Enable software flow control.
      rtscts (bool) – Enable hardware (RTS/CTS) flow control.
      dsrdtr (bool) – Enable hardware (DSR/DTR) flow control.
      write_timeout (float) – Set a write timeout value.
      inter_byte_timeout (float) – Inter-character timeout, None to disable (default).
      exclusive (bool) – Set exclusive access mode (POSIX only). A port cannot be opened in exclusive access mode if it is already open in exclusive access mode.

    • 参数(翻译):
      port–设备名称或无。
      baudrate(int)–波特率,例如9600或115200等。
      bytesize –数据位数。 可能的值:五位,六位,七位,八位
      parity–奇偶校验。 可能的值:PARITY_NONE,PARITY_EVEN,PARITY_ODD,PARITY_MARK,PARITY_SPACE
      stopbits –停止位的数量。 可能的值:STOPBITS_ONE,STOPBITS_ONE_POINT_FIVE,STOPBITS_TWO
      timeout(浮动)–设置读取超时值。
      xonxoff(布尔)–启用软件流控制。
      rtscts(布尔)–启用硬件(RTS / CTS)流控制。
      dsrdtr(布尔)–启用硬件(DSR / DTR)流控制。
      write_timeout(浮点型)–设置写超时值。
      inter_byte_timeout(浮点型)–字符间超时,无则禁用(默认)。
      exclusive(布尔)–设置独占访问模式(仅POSIX)。 如果端口已经以独占访问模式打开,则不能以独占访问模式打开端口。
      给定端口后,将在创建对象时立即打开该端口。 当端口为None且需要连续调用open()时,不会打开它。

    • Raises:
      ValueError – Will be raised when parameter are out of range, e.g. baud rate, data bits.
      SerialException – In case the device can not be found or can not be configured.
      ValueError –当参数超出范围时会引发,例如 波特率,数据位。
      SerialException –如果找不到或无法配置设备。

    端口是设备名称:取决于操作系统。 例如 在GNU / Linux上为/ dev / ttyUSB0,在Windows上为COM3。

    参数波特率可以是以下标准值之一:50、75、110、134、150、200、300、600、1200、1800、2400、4800、9600、19200、38400、57600、115200。 (取决于平台)

    115200以上的标准值,例如:230400、460800、500000、576000、921600、1000000、1152000、1500000、2000000、2500000、3000000、3500000、4000000也可在许多平台和设备上运行。

    在某些平台(GNU / Linux,MAC OSX> = Tiger,Windows)上也支持非标准值。 但是,即使在这些平台上,某些串行端口也可能拒绝非标准值。

    控制read()行为的参数timeout的取值:

    • timeout=无:永远等待/直到收到请求的字节数
    • timeout= 0:非阻塞模式,在任何情况下立即返回,返回零个或多个,直到请求的字节数
    • timeout= x:将timeout设置为x秒(允许浮动),当请求的字节数可用时立即返回,否则请等待直到超时到期并返回直到那时为止接收到的所有字节。

    除非设置了write_timeout,否则默认情况下write()处于阻塞状态。 可能的取值,请参考上面的timeout。

    请注意,可能不支持同时启用两种流控制方法(xonxoff和rtscts)。 通常一次使用一种方法,而不是同时使用。

    并非所有平台都支持dsrdtr(已被忽略)。 将其设置为None会导致其状态遵循rtscts。

    还可以考虑使用函数serial_for_url()代替直接创建Serial实例。

    open()

    打开端口。 将应用rts和dtr的状态。

    注:打开端口后,某些操作系统和/或驱动程序可能会自动激活RTS或DTR。 当rts或dtr的设置与默认值不同时(True / active),RTS / DTR可能会出现故障。

    close()

    立即关闭端口。

    __ del __()

    析构函数,在释放串行端口实例时关闭端口。

    read(size=1)

    读取串口(默认读取字节大小= 1)

    • Parameters:
      size – Number of bytes to read.
      Returns: Bytes read from the port.
      Return type: bytes
    • 参数:
      size –要读取的字节数。
      返回:从端口读取的字节。
      返回类型:字节

    Read size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.
    从串行端口读取大小字节。 如果设置了超时,它可能会根据要求返回更少的字符。 没有超时,它将阻塞直到读取请求的字节数。

    read_until(expected=LF, size=None)

    read_until(期望= LF,大小=无)

    • Parameters:
      expected – The byte string to search for.
      size – Number of bytes to read.
      Returns: Bytes read from the port.
      Return type: bytes
    • 参数:
      预期–要搜索的字节字符串。
      size –要读取的字节数。
      返回值:从端口读取的字节。
      返回类型:字节

    Read until an expected sequence is found (‘\n’ by default), the size is exceeded or until timeout occurs. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.
    读取直到找到期望的序列(默认为“ \ n”),超出大小或直到发生超时为止。 如果设置了超时,它可能会根据要求返回更少的字符。 若没有超时,它将阻塞直到读取请求的字节数。

    write(data)

    写(数据)

    • Parameters: data – Data to send.
      Returns: Number of bytes written.
      Return type: int
      Raises: SerialTimeoutException – In case a write timeout is configured for the port and the time is exceeded.

    • 参数:data –要发送的数据。
      返回:写入的字节数。
      返回类型:int
      引发:SerialTimeoutException-如果为端口配置了写超时并且超过了时间。

    将字节数据写入端口。 数据应该是字节类型(或兼容的,例如字节数组或内存视图)。 Unicode字符串必须经过编码(例如’hello’.encode(‘utf-8’)

    flush()

    Flush of file like objects. In this case, wait until all data is written.
    清除文件一样的对象。 在这种情况下,请等待所有数据写入后执行。

    in_waiting

    Getter:获取输入缓冲区中的字节数
    类型:int
    返回接收缓冲区中的字节数。

    out_waiting

    Getter:获取输出缓冲区中的字节数
    类型:int
    平台:Posix
    平台:Windows
    返回输出缓冲区中的字节数。

    rts

    设置器:设置RTS线路的状态
    Getter:返回RTS线路的状态
    类型:布尔
    将RTS线路设置为指定的逻辑电平。 可以在打开串行端口之前分配此值,然后在open()上应用该值(有限制,请参见open())。

    dtr

    设置器:设置DTR线的状态
    Getter:返回DTR线的状态
    类型:布尔
    将DTR线设置为指定的逻辑电平。 可以在打开串行端口之前分配此值,然后在open()上应用该值(有限制,请参见open())。


    is_open

    只读
    Getter:获取串行端口的状态,判断它是否打开。
    类型:布尔


    New values can be assigned to the following attributes (properties), the port will be reconfigured, even if it’s opened at that time:
    可以将新值分配给以下属性(属性),即使端口当时已打开,也将对其进行重新配置:

    port

    类型:str
    读取或写入端口。当端口已经打开时,它将被关闭并使用新设置重新打开。

    baudrate

    Getter:获取当前波特率
    设置器:设置新的波特率
    类型:int
    读取或写入当前波特率设置。

    bytesize

    Getter:获取当前字节大小
    设置器:设置新的字节大小。可能的值:FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS
    类型:int
    读取或写入当前数据字节大小设置。

    parity

    Getter:获取当前的奇偶校验设置
    设置器:设置新的奇偶校验模式。可能的值:PARITY_NONE,PARITY_EVEN,PARITY_ODD,PARITY_MARK,PARITY_SPACE
    读取或写入当前的奇偶校验设置。

    stopbits

    Getter:获取当前的停止位设置
    设置器:设置新的停止位设置。可能的值:STOPBITS_ONE,STOPBITS_ONE_POINT_FIVE,STOPBITS_TWO
    读取或写入当前停止位宽度设置。

    timeout

    Getter:获取当前读取超时设置
    设置器:设置读取超时
    类型:浮点(秒)
    读取或写入当前读取超时设置。

    write_timeout

    Getter:获取当前写入超时设置
    设置器:设置写超时
    类型:浮点(秒)
    读取或写入当前写入超时设置。


    以下方法用于与io库兼容。

    readable()

    可读的
    返回:True
    2.5版的新功能。

    writable()

    可写的
    返回:True
    2.5版的新功能。

    seekable()

    返回:False
    2.5版的新功能。

    readinto(b)

    读入(b)

    • Parameters: b – bytearray or array instance
      Returns: Number of byte read
      参数:b-字节数组或数组实例
      返回:读取的字节数
    • Read up to len(b) bytes into bytearray b and return the number of bytes read.
      读取len(b)个字节到字节数组b中,并返回读取的字节数。

    2.5版的新功能。

    readline(size=-1)

    readline(大小= -1)
    读取串口数据中的一行

    通过io.IOBase.readline()提供

    readlines(hint=-1)

    readlines(提示= -1)
    将串口数据的每一行全部读取,放在一个一维字符串数组中,每个数组元素是一行字符串。

    通过io.IOBase.readlines()提供

    writelines(lines)

    通过io.IOBase.writelines()提供


    serial库

    serial 0.0.97

    A framework for serializing/deserializing JSON/YAML/XML into python class instances and vice versa
    一个将JSON / YAML / XML序列化/反序列化为python类实例的框架,反之亦然

    展开全文
  • Python更新pyserial

    2018-09-27 14:11:09
    Python更新pyserial 打开网页https://pypi.org/ 搜索pyserial 下载最新版本pyserial 切换到下载目录cd ~/Download 解压安装包tar -xzf pyserial-3.4 切换到安装包目录cd pyserial-3.4 安装sudo python setup.py ...
  • Pyserial_Test-源码

    2021-04-03 12:55:42
    Pyserial_Test PyQT串列埠测试
  • pySerial 3.4
  • pyserial 安装步骤

    千次阅读 2019-03-15 16:55:17
    pyserial安装步骤
  • pyserial相关资料整理

    2021-05-14 23:25:30
    关于pyserial的基本操作 pythonserial函数_Python Serial串口基本操作(收发数据) 关于pyserial read、readline python serial串口通信时read、readline、read_all等方法的区别 关于pyserial timeout 1.pyserial ...
  • pyserial安装

    2014-09-04 13:27:00
    参考网址:pyserial.sourceforge.net/pyserial.html#installation Download the archive from http://pypi.python.org/pypi/pyserial. Unpack the archive, enter the pyserial-x.y directory and run: python s...
  • Anaconda安装Pyserial

    千次阅读 2017-10-20 18:17:40
    在Anaconda Navigator里面找到了2.7版本(较... 参考anaconda / packages / pyserial 3.4, 在Windows的cmd里面敲: conda install -c anaconda pyserial 显示没有conda指令. 用everything搜索conda.exe的路径, This PC(计
  • pyserial-3.5.tar.gz

    2021-02-20 11:37:42
    pyserial-3.5源码
  • Pyserial文件传输

    2021-07-30 18:04:30
    Pyserial文件传输 本想随便找个demo用一下,竟没有搜到文件传输的代码,于是乎写了一个,希望对读者有帮助。简单的数据传输百度可以搜到很多,这里不做累坠了。 client import serial #pip install pyserial ...
  • python pySerial模块介绍

    千次阅读 2018-08-29 10:12:27
    Python中有专门的串口操作模块pySerial,使用非常简单。 pySerial的资源网址https://pypi.python.org/pypi/pyserial, github资源和一些使用教程的网址:https://github.com/pyserial/pyserial 串口操作文档...
  • pyserial串口学习

    2019-07-17 11:32:10
    pyserial 3.4 买了一个小玩具,测空气质量的,数据通过串口传输,所以就想用python写一个读数据的小程序。 前期准备 安装pyserial serial就是串口的意思,用来操作串口名字起的还是很不错的(看谁先下手) 打开...
  • How do I access the USB port using pyserial? I have seen an example with:import serialser = serial.Serial('/dev/ttyUSB0')I used to access the serial port from MATLAB on Windows and using the appropria...
  • Pyserial库使用心得

    2021-08-17 10:32:39
    Pyserial的使用心得Pyserial库的安装Serial对象常用属性常用方法例子小结 Pyserial库的安装 将python版本更新到2.7及以上,或3.4及以上,然后直接使用pip安装: pip install pyserial Serial对象 导入pyserial包后...
  • pyserial
  • 安装pyserial pip install pyserial 查看可用的端口 # coding:utf-8 import serial.tools.list_ports plist = list(serial.tools.list_ports.comports()) if len(plist) <= 0: print(没有发现端口!) else: ...
  • Pyserial-Demo-master.zip

    2020-07-22 13:09:44
    使用python的pyserial模块实现串口通讯,使用PYQT5制作成上位机模式,目前仅在windows下进行测试,可尝试在linux下进行调试。软件支持二次开发。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,757
精华内容 1,102
关键字:

pySerial