PyQt5 serial模块-串口小工具

news2024/11/19 18:27:52

PyQt5 serial模块-串口小工具

  • 串口简述
  • serial模块
    • 参数
    • 方法
    • 使用模板
    • 串口工具示例

串口简述

异步串行是指UART(Universal Asynchronous Receiver/Transmitter),通用异步接收/发送。UART是一个并行输入成为串行输出的芯片,通常集成在主板上。UART包含TTL电平的串口和RS232电平的串口。 TTL电平是3.3V的,而RS232是负逻辑电平,它定义+5+12V为低电平,而-12-5V为高电平,MDS2710、MDS SD4、EL805等是RS232接口,EL806有TTL接口。

串行接口按电气标准及协议来分包括RS-232-C、RS-422、RS485等。RS-232-C、RS-422与RS-485标准只对接口的电气特性做出规定,不涉及接插件、电缆或协议。

  • RS-232
    也称标准串口,最常用的一种串行通讯接口。它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“ [1] 数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”。传统的RS-232-C接口标准有22根线,采用标准25芯D型插头座(DB25),后来使用简化为9芯D型插座(DB9),现在应用中25芯插头座已很少采用。
    RS-232采取不平衡传输方式,即所谓单端通讯。由于其发送电平与接收电平的差仅为2V至3V左右,所以其共模抑制能力差,再加上双绞线上的分布电容,其传送距离最大为约15米,最高速率为20kb/s。RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为3~7kΩ。所以RS-232适合本地设备之间的通信。 [2]
  • RS-422
    标准全称是“平衡电压数字接口电路的电气特性”,它定义了接口电路的特性。典型的RS-422是四线接口。实际上还有一根信号地线,共5根线。其DB9连接器引脚定义。由于接收器采用高输入阻抗和发送驱动器比RS232更强的驱动能力,故允许在相同传输线上连接多个接收节点,最多可接10个节点。即一个主设备(Master),其余为从设备(Slave),从设备之间不能通信,所以RS-422支持点对多的双向通信。接收器输入阻抗为4k,故发端最大负载能力是10×4k+100Ω(终接电阻)。RS-422四线接口由于采用单独的发送和接收通道,因此不必控制数据方向,各装置之间任何必须的信号交换均可以按软件方式(XON/XOFF握手)或硬件方式(一对单独的双绞线)实现。
    RS-422的最大传输距离为1219米,最大传输速率为10Mb/s。其平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能达到最大传输距离。只有在很短的距离下才能获得最高速率传输。一般100米长的双绞线上所能获得的最大传输速率仅为1Mb/s。
  • RS-485
    是从RS-422基础上发展而来的,所以RS-485许多电气规定与RS-422相仿。如都采用平衡传输方式、都需要在传输线上接终接电阻等。RS-485可以采用二线与四线方式,二线制可实现真正的多点双向通信,而采用四线连接时,与RS-422一样只能实现点对多的通信,即只能有一个主(Master)设备,其余为从设备,但它比RS-422有改进,无论四线还是二线连接方式总线上可多接到32个设备。
    RS-485与RS-422的不同还在于其共模输出电压是不同的,RS-485是-7V至+12V之间,而RS-422在-7V至+7V之间,RS-485接收器最小输入阻抗为12kΩ、RS-422是4kΩ;由于RS-485满足所有RS-422的规范,所以RS-485的驱动器可以在RS-422网络中应用。
    RS-485与RS-422一样,其最大传输距离约为1219米,最大传输速率为10Mb/s。平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能使用规定最长的电缆长度。只有在很短的距离下才能获得最高速率传输。一般100米长双绞线最大传输速率仅为1Mb/s。
    注:以上内容摘自百度百科。

引脚定义:
RX(Receive Data):接收数据
TX(Transmit Data):发送数据
CTS(Clear To Send): 清除发送
RTS(Request To Send):请求发送
DTR(Data Terminal Ready):数据终端准备好
DSR(Data Set Ready):数据准备好

如果UART只有RX、TX两个信号,要流控的话只能是软流控;
如果有RX,TX,CTS,RTS 四个信号,则多半是支持硬流控的UART;
如果有 RX,TX,CTS ,RTS ,DTR,DSR 六个信号的话,RS232标准的可能性比较大。

serial模块

参数

参数描述
port端口号,如:‘COM9’
baudrate波特率,如:115200
bytesize数据位,取值有:FIVEBITS,SIXBITS,SEVENBITS,EIGHTBITS
parity校验为,取值有:PARITY_NONE,PARITY_ODD,PARITY_EVEN,PARITY_MARK,PARITY_SPACE,PARITY_NAMES
stopbits停止位,取值有:STOPBITS_ONE,STOPBITS_ONE_POINT_FIVE,STOPBITS_TWO
timeout超时时间
xonxoff软件流控:False/True
rtscts硬件流控(发送):False/True
dsrdtr硬件流控(准备好):False/True

方法

方法描述
serial.isOpen()判断端口是否已打开,True:已打开,False:已关闭
serial.open()打开端口
serial.close()关闭端口
serial.read()从端口读取字节数据,无参读取1个字节数据,也可以指定读取n个字节数据
serial.read_all()从端口读取全部接收数据
serial.readline()从端口读取一行数据,遇到\n为一行数据,也可指定读取一行数据的最大长度
serial.readlines()从端口读取多行数据
serial.write(b’test data’)向端口写入字节数据
serial.in_waiting()返回接收缓存中字节个数
serial.flush()等待所有数据写入
serial.flushInput()丢弃接收缓存中断所有数据
serial.flushOutput()终止当前写入操作,并丢弃所有发送缓存中的数据

使用模板

  • 初始化端口无指定参数
    mSerial = serial.Serial()
    mSerial.port = ‘COM9’
    mSerial.baudrate = 115200
    …其它端口参数
    m.Serial.open() # 打开端口
    mSerial.isOpen()
    mSerial.read()
    mSerial.write(b’hello world’)
  • 初始化端口指定端口号和波特率
    mSerial = serial.Serial(‘COM9’, 115200)
    mSerial.isOpen()
    mSerial.read()
    mSerial.write(b’hello world’)
  • 初始化端口指定所有参数
    mSerial = serial.Serial(port=‘COM9’, baudrate=115200, bytesize=8, parity=‘N’, stopbits=1, timeout=100, xonxoff=False, rtscts=False, dsrdtr=False)
    mSerial.isOpen()
    mSerial.read()
    mSerial.write(b’hello world’)

串口工具示例

主程序代码

import sys
import serial
import serial.tools.list_ports

from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

from ui_comport import Ui_MainWindow

class ComPortWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None) -> None:
        super(ComPortWindow, self).__init__(parent)
        self.setupUi(self)

        self.setWindowTitle('串口小工具')
        self.setWindowIcon(QIcon('./images/iconCOM9.png'))

        self.mSerial = serial.Serial()
        self.ScanComPort() # 扫描一次串口端口
        self.OnPortChanged()
 
        self.comboBox_Baudrate.setCurrentText("115200") # 设置默认波特率
        self.comboBox_ByteSize.setCurrentText("8")      # 设置默认数据位
        
        self.BtnScanPort.clicked.connect(self.ScanComPort)
        self.BtnOpenPort.clicked.connect(self.OpenComPort)
        self.BtnClosePort.clicked.connect(self.CloseComPort)
        self.BtnSendData.clicked.connect(self.SendData)
        self.BtnClearRecv.clicked.connect(self.ClearRecvText)
        self.BtnClearSend.clicked.connect(self.ClearSendText)
        self.comboBox_ComPort.currentIndexChanged.connect(self.OnPortChanged)

        # 串口接收数据定时器
        self.recvTimer = QTimer(self)
        self.recvTimer.timeout.connect(self.RecvData)

    def ClearRecvText(self):
        self.textBrowserRecvArea.clear()

    def ClearSendText(self):
        self.lineEdit_SendData.clear()

    def OnPortChanged(self):
        if len(self.portDict) > 0:
            self.label_CurrentPortName.setText(self.portDict[self.comboBox_ComPort.currentText()])

    def ScanComPort(self):
        self.portDict = {}
        self.comboBox_ComPort.clear()
        portList = list(serial.tools.list_ports.comports())
        for port in portList:
            self.portDict["%s" % port[0]] = "%s" % port[1]
            self.comboBox_ComPort.addItem(port[0])
        if len(self.portDict) == 0:
            QMessageBox.critical(self, "警告", "未找到串口", QMessageBox.Cancel, QMessageBox.Cancel)
        pass

    def OpenComPort(self):
        # 设置端口号
        self.mSerial.port = self.comboBox_ComPort.currentText()

        # 设置波特率
        self.mSerial.baudrate = int(self.comboBox_Baudrate.currentText())

        # 数据位设置
        bytesize = self.comboBox_ByteSize.currentText()
        if "5" == bytesize:
            self.mSerial.bytesize = serial.FIVEBITS
        elif "6" == bytesize:
            self.mSerial.bytesize = serial.SIXBITS
        elif "7" == bytesize:
            self.mSerial.bytesize = serial.SEVENBITS
        elif "8" == bytesize:
            self.mSerial.bytesize = serial.EIGHTBITS

        # 停止位设置
        stopbitsItems = [serial.STOPBITS_ONE, serial.STOPBITS_ONE_POINT_FIVE, serial.STOPBITS_TWO]
        self.mSerial.stopbits = stopbitsItems[self.comboBox_Stopbits.currentIndex()]

        # 校验位设置
        parityItmes = [serial.PARITY_NONE, 
                    serial.PARITY_ODD,
                    serial.PARITY_EVEN,
                    serial.PARITY_MARK,
                    serial.PARITY_SPACE,
                    serial.PARITY_NAMES]
        self.mSerial.parity = parityItmes[self.comboBox_Parity.currentIndex()]
        
        stopbitsItems = [serial.STOPBITS_ONE, serial.STOPBITS_ONE_POINT_FIVE, serial.STOPBITS_TWO]
        self.mSerial.stopbits = stopbitsItems[self.comboBox_Stopbits.currentIndex()]           # 停止为[]

        flowctrl = self.comboBox_FlowCtrl.currentText()
        if 'None' == flowctrl:
            self.mSerial.xonxoff = False            # 软件流控       
            self.mSerial.rtscts = False             # 硬件流控
            self.mSerial.dsrdtr = False             # 硬件流控
        elif 'XON/XOFF' == flowctrl:
            self.mSerial.xonxoff = True            # 软件流控       
            self.mSerial.rtscts = False             # 硬件流控
            self.mSerial.dsrdtr = False             # 硬件流控          
        elif 'RTS/CTS' == flowctrl:
            self.mSerial.xonxoff = False            # 软件流控       
            self.mSerial.rtscts = True             # 硬件流控
            self.mSerial.dsrdtr = False             # 硬件流控

        # 超时时间
        self.mSerial.timeout = 100

        if self.mSerial.isOpen():
            QMessageBox.warning(self, "警告", "串口已打开", QMessageBox.Cancel, QMessageBox.Cancel)
        else:
            try:
                self.BtnOpenPort.setEnabled(False)
                self.mSerial.open()
                self.mSerial.flushInput()
                self.mSerial.flushOutput()
                self.recvTimer.start(20)
            except:
                QMessageBox.critical(self, "警告", "串口打开失败", QMessageBox.Cancel, QMessageBox.Cancel)
                self.BtnOpenPort.setEnabled(True)
        
        # 打印端口信息
        print(self.mSerial)

    def CloseComPort(self):
        self.recvTimer.stop()
        if self.mSerial.isOpen():
            self.BtnOpenPort.setEnabled(True)
            self.mSerial.flushInput()
            self.mSerial.flushOutput()
            self.mSerial.close()            
        pass
    
    def SendData(self):
        if self.mSerial.isOpen():
            sendtext = self.lineEdit_SendData.text()
            sendtext = sendtext + '\r\n'
            self.mSerial.write(sendtext.encode("utf-8"))
            print("send data:", sendtext)
        else:
            QMessageBox.warning(self, "警告", "串口未打开,请先打开串口", QMessageBox.Cancel, QMessageBox.Cancel)

    def RecvData(self):
        dataheader = b'$$:' # 数据帧头, 原始数据帧格式 '$$:10,11,12'

        try:
            num = self.mSerial.inWaiting()
        except:
            self.CloseComPort()

        if num > 0:
            try:
                self.data = self.mSerial.readline(1024)
                # 读取一行数据 添加到数据接收显示区
                if self.data.endswith("\n".encode("utf-8")):
                    self.textBrowserRecvArea.append(self.data.decode("utf-8"))

                # 解析数据项,数据帧以 b'$$:' 开头,多个数据参数之间以 ‘,’ 分割, 数据帧以'\r\n'结束 
                if self.data.decode('UTF-8').startswith(dataheader.decode('UTF-8')):
                    rawdata = self.data[len(dataheader) : len(self.data)-2]
                    data = rawdata.split(b',')
                    print(int(data[0]), int(data[1]), int(data[2]))
            except:
                pass


if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = ComPortWindow()
    win.show()
    sys.exit(app.exec_())

QtDesigner UI界面设计:
在这里插入图片描述
QtDesigner UI文件 comport.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>1135</width>
    <height>713</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QGroupBox" name="groupBox_ComSettings">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>20</y>
      <width>221</width>
      <height>471</height>
     </rect>
    </property>
    <property name="title">
     <string>串口设置</string>
    </property>
    <widget class="QWidget" name="horizontalLayoutWidget">
     <property name="geometry">
      <rect>
       <x>10</x>
       <y>400</y>
       <width>201</width>
       <height>51</height>
      </rect>
     </property>
     <layout class="QHBoxLayout" name="horizontalLayout">
      <item>
       <widget class="QPushButton" name="BtnOpenPort">
        <property name="text">
         <string>打开串口</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QPushButton" name="BtnClosePort">
        <property name="text">
         <string>关闭串口</string>
        </property>
       </widget>
      </item>
     </layout>
    </widget>
    <widget class="QWidget" name="horizontalLayoutWidget_2">
     <property name="geometry">
      <rect>
       <x>10</x>
       <y>350</y>
       <width>201</width>
       <height>51</height>
      </rect>
     </property>
     <layout class="QHBoxLayout" name="horizontalLayout_8">
      <item>
       <widget class="QPushButton" name="BtnScanPort">
        <property name="text">
         <string>扫描端口</string>
        </property>
       </widget>
      </item>
     </layout>
    </widget>
    <widget class="QLabel" name="label_CurrentPortName">
     <property name="geometry">
      <rect>
       <x>10</x>
       <y>20</y>
       <width>201</width>
       <height>31</height>
      </rect>
     </property>
     <property name="text">
      <string/>
     </property>
    </widget>
    <widget class="QWidget" name="layoutWidget">
     <property name="geometry">
      <rect>
       <x>10</x>
       <y>60</y>
       <width>201</width>
       <height>281</height>
      </rect>
     </property>
     <layout class="QVBoxLayout" name="verticalLayout">
      <item>
       <layout class="QHBoxLayout" name="horizontalLayout_2">
        <item>
         <widget class="QLabel" name="label_ComPort">
          <property name="maximumSize">
           <size>
            <width>60</width>
            <height>16777215</height>
           </size>
          </property>
          <property name="text">
           <string>串  口</string>
          </property>
         </widget>
        </item>
        <item>
         <widget class="QComboBox" name="comboBox_ComPort">
          <property name="editable">
           <bool>false</bool>
          </property>
         </widget>
        </item>
       </layout>
      </item>
      <item>
       <layout class="QHBoxLayout" name="horizontalLayout_3">
        <item>
         <widget class="QLabel" name="label_Baudrate">
          <property name="maximumSize">
           <size>
            <width>60</width>
            <height>16777215</height>
           </size>
          </property>
          <property name="text">
           <string>波特率</string>
          </property>
         </widget>
        </item>
        <item>
         <widget class="QComboBox" name="comboBox_Baudrate">
          <property name="editable">
           <bool>true</bool>
          </property>
          <property name="currentText">
           <string>115200</string>
          </property>
          <property name="currentIndex">
           <number>8</number>
          </property>
          <item>
           <property name="text">
            <string>2400</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>4800</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>9600</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>14400</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>19200</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>38400</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>56000</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>57600</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>115200</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>128000</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>256000</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>230400</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>1000000</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>2000000</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>3000000</string>
           </property>
          </item>
         </widget>
        </item>
       </layout>
      </item>
      <item>
       <layout class="QHBoxLayout" name="horizontalLayout_4">
        <item>
         <widget class="QLabel" name="label_ByteSize">
          <property name="maximumSize">
           <size>
            <width>60</width>
            <height>16777215</height>
           </size>
          </property>
          <property name="text">
           <string>数据位</string>
          </property>
         </widget>
        </item>
        <item>
         <widget class="QComboBox" name="comboBox_ByteSize">
          <property name="editable">
           <bool>false</bool>
          </property>
          <property name="currentText">
           <string>8</string>
          </property>
          <property name="currentIndex">
           <number>3</number>
          </property>
          <item>
           <property name="text">
            <string>5</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>6</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>7</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>8</string>
           </property>
          </item>
         </widget>
        </item>
       </layout>
      </item>
      <item>
       <layout class="QHBoxLayout" name="horizontalLayout_6">
        <item>
         <widget class="QLabel" name="label_Stopbits">
          <property name="maximumSize">
           <size>
            <width>60</width>
            <height>16777215</height>
           </size>
          </property>
          <property name="text">
           <string>停止位</string>
          </property>
         </widget>
        </item>
        <item>
         <widget class="QComboBox" name="comboBox_Stopbits">
          <item>
           <property name="text">
            <string>1</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>1.5</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>2</string>
           </property>
          </item>
         </widget>
        </item>
       </layout>
      </item>
      <item>
       <layout class="QHBoxLayout" name="horizontalLayout_5">
        <item>
         <widget class="QLabel" name="label_Parity">
          <property name="maximumSize">
           <size>
            <width>60</width>
            <height>16777215</height>
           </size>
          </property>
          <property name="text">
           <string>校验位</string>
          </property>
         </widget>
        </item>
        <item>
         <widget class="QComboBox" name="comboBox_Parity">
          <item>
           <property name="text">
            <string>None</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>Odd</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>Even</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>Mark</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>Space</string>
           </property>
          </item>
         </widget>
        </item>
       </layout>
      </item>
      <item>
       <layout class="QHBoxLayout" name="horizontalLayout_7">
        <item>
         <widget class="QLabel" name="label_CTS">
          <property name="maximumSize">
           <size>
            <width>60</width>
            <height>16777215</height>
           </size>
          </property>
          <property name="text">
           <string>流  控</string>
          </property>
         </widget>
        </item>
        <item>
         <widget class="QComboBox" name="comboBox_FlowCtrl">
          <item>
           <property name="text">
            <string>None</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>RTS/CTS</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>XON/XOFF</string>
           </property>
          </item>
         </widget>
        </item>
       </layout>
      </item>
     </layout>
    </widget>
   </widget>
   <widget class="QGroupBox" name="groupBox">
    <property name="geometry">
     <rect>
      <x>250</x>
      <y>20</y>
      <width>871</width>
      <height>471</height>
     </rect>
    </property>
    <property name="title">
     <string>接收区</string>
    </property>
    <widget class="QTextBrowser" name="textBrowserRecvArea">
     <property name="geometry">
      <rect>
       <x>10</x>
       <y>20</y>
       <width>851</width>
       <height>441</height>
      </rect>
     </property>
    </widget>
   </widget>
   <widget class="QGroupBox" name="groupBox_2">
    <property name="geometry">
     <rect>
      <x>250</x>
      <y>500</y>
      <width>871</width>
      <height>161</height>
     </rect>
    </property>
    <property name="title">
     <string>发送区</string>
    </property>
    <widget class="QLineEdit" name="lineEdit_SendData">
     <property name="geometry">
      <rect>
       <x>10</x>
       <y>20</y>
       <width>851</width>
       <height>51</height>
      </rect>
     </property>
    </widget>
    <widget class="QPushButton" name="BtnSendData">
     <property name="geometry">
      <rect>
       <x>10</x>
       <y>80</y>
       <width>71</width>
       <height>71</height>
      </rect>
     </property>
     <property name="text">
      <string>发送数据</string>
     </property>
    </widget>
   </widget>
   <widget class="QGroupBox" name="groupBox_3">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>500</y>
      <width>221</width>
      <height>161</height>
     </rect>
    </property>
    <property name="title">
     <string>/发控制</string>
    </property>
    <widget class="QPushButton" name="BtnClearRecv">
     <property name="geometry">
      <rect>
       <x>10</x>
       <y>20</y>
       <width>201</width>
       <height>61</height>
      </rect>
     </property>
     <property name="text">
      <string>清空接收区</string>
     </property>
    </widget>
    <widget class="QPushButton" name="BtnClearSend">
     <property name="geometry">
      <rect>
       <x>10</x>
       <y>90</y>
       <width>201</width>
       <height>61</height>
      </rect>
     </property>
     <property name="text">
      <string>清空发送区</string>
     </property>
    </widget>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>1135</width>
     <height>26</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

comport.ui文件编译生成的ui_comport.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'd:\project\python\串口工具\串口收发工具\comport.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1135, 713)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.groupBox_ComSettings = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox_ComSettings.setGeometry(QtCore.QRect(10, 20, 221, 471))
        self.groupBox_ComSettings.setObjectName("groupBox_ComSettings")
        self.horizontalLayoutWidget = QtWidgets.QWidget(self.groupBox_ComSettings)
        self.horizontalLayoutWidget.setGeometry(QtCore.QRect(10, 400, 201, 51))
        self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.BtnOpenPort = QtWidgets.QPushButton(self.horizontalLayoutWidget)
        self.BtnOpenPort.setObjectName("BtnOpenPort")
        self.horizontalLayout.addWidget(self.BtnOpenPort)
        self.BtnClosePort = QtWidgets.QPushButton(self.horizontalLayoutWidget)
        self.BtnClosePort.setObjectName("BtnClosePort")
        self.horizontalLayout.addWidget(self.BtnClosePort)
        self.horizontalLayoutWidget_2 = QtWidgets.QWidget(self.groupBox_ComSettings)
        self.horizontalLayoutWidget_2.setGeometry(QtCore.QRect(10, 350, 201, 51))
        self.horizontalLayoutWidget_2.setObjectName("horizontalLayoutWidget_2")
        self.horizontalLayout_8 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_2)
        self.horizontalLayout_8.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_8.setObjectName("horizontalLayout_8")
        self.BtnScanPort = QtWidgets.QPushButton(self.horizontalLayoutWidget_2)
        self.BtnScanPort.setObjectName("BtnScanPort")
        self.horizontalLayout_8.addWidget(self.BtnScanPort)
        self.label_CurrentPortName = QtWidgets.QLabel(self.groupBox_ComSettings)
        self.label_CurrentPortName.setGeometry(QtCore.QRect(10, 20, 201, 31))
        self.label_CurrentPortName.setText("")
        self.label_CurrentPortName.setObjectName("label_CurrentPortName")
        self.layoutWidget = QtWidgets.QWidget(self.groupBox_ComSettings)
        self.layoutWidget.setGeometry(QtCore.QRect(10, 60, 201, 281))
        self.layoutWidget.setObjectName("layoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.layoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label_ComPort = QtWidgets.QLabel(self.layoutWidget)
        self.label_ComPort.setMaximumSize(QtCore.QSize(60, 16777215))
        self.label_ComPort.setObjectName("label_ComPort")
        self.horizontalLayout_2.addWidget(self.label_ComPort)
        self.comboBox_ComPort = QtWidgets.QComboBox(self.layoutWidget)
        self.comboBox_ComPort.setEditable(False)
        self.comboBox_ComPort.setObjectName("comboBox_ComPort")
        self.horizontalLayout_2.addWidget(self.comboBox_ComPort)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.label_Baudrate = QtWidgets.QLabel(self.layoutWidget)
        self.label_Baudrate.setMaximumSize(QtCore.QSize(60, 16777215))
        self.label_Baudrate.setObjectName("label_Baudrate")
        self.horizontalLayout_3.addWidget(self.label_Baudrate)
        self.comboBox_Baudrate = QtWidgets.QComboBox(self.layoutWidget)
        self.comboBox_Baudrate.setEditable(True)
        self.comboBox_Baudrate.setObjectName("comboBox_Baudrate")
        self.comboBox_Baudrate.addItem("")
        self.comboBox_Baudrate.addItem("")
        self.comboBox_Baudrate.addItem("")
        self.comboBox_Baudrate.addItem("")
        self.comboBox_Baudrate.addItem("")
        self.comboBox_Baudrate.addItem("")
        self.comboBox_Baudrate.addItem("")
        self.comboBox_Baudrate.addItem("")
        self.comboBox_Baudrate.addItem("")
        self.comboBox_Baudrate.addItem("")
        self.comboBox_Baudrate.addItem("")
        self.comboBox_Baudrate.addItem("")
        self.comboBox_Baudrate.addItem("")
        self.comboBox_Baudrate.addItem("")
        self.comboBox_Baudrate.addItem("")
        self.horizontalLayout_3.addWidget(self.comboBox_Baudrate)
        self.verticalLayout.addLayout(self.horizontalLayout_3)
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.label_ByteSize = QtWidgets.QLabel(self.layoutWidget)
        self.label_ByteSize.setMaximumSize(QtCore.QSize(60, 16777215))
        self.label_ByteSize.setObjectName("label_ByteSize")
        self.horizontalLayout_4.addWidget(self.label_ByteSize)
        self.comboBox_ByteSize = QtWidgets.QComboBox(self.layoutWidget)
        self.comboBox_ByteSize.setEditable(False)
        self.comboBox_ByteSize.setObjectName("comboBox_ByteSize")
        self.comboBox_ByteSize.addItem("")
        self.comboBox_ByteSize.addItem("")
        self.comboBox_ByteSize.addItem("")
        self.comboBox_ByteSize.addItem("")
        self.horizontalLayout_4.addWidget(self.comboBox_ByteSize)
        self.verticalLayout.addLayout(self.horizontalLayout_4)
        self.horizontalLayout_6 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_6.setObjectName("horizontalLayout_6")
        self.label_Stopbits = QtWidgets.QLabel(self.layoutWidget)
        self.label_Stopbits.setMaximumSize(QtCore.QSize(60, 16777215))
        self.label_Stopbits.setObjectName("label_Stopbits")
        self.horizontalLayout_6.addWidget(self.label_Stopbits)
        self.comboBox_Stopbits = QtWidgets.QComboBox(self.layoutWidget)
        self.comboBox_Stopbits.setObjectName("comboBox_Stopbits")
        self.comboBox_Stopbits.addItem("")
        self.comboBox_Stopbits.addItem("")
        self.comboBox_Stopbits.addItem("")
        self.horizontalLayout_6.addWidget(self.comboBox_Stopbits)
        self.verticalLayout.addLayout(self.horizontalLayout_6)
        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
        self.label_Parity = QtWidgets.QLabel(self.layoutWidget)
        self.label_Parity.setMaximumSize(QtCore.QSize(60, 16777215))
        self.label_Parity.setObjectName("label_Parity")
        self.horizontalLayout_5.addWidget(self.label_Parity)
        self.comboBox_Parity = QtWidgets.QComboBox(self.layoutWidget)
        self.comboBox_Parity.setObjectName("comboBox_Parity")
        self.comboBox_Parity.addItem("")
        self.comboBox_Parity.addItem("")
        self.comboBox_Parity.addItem("")
        self.comboBox_Parity.addItem("")
        self.comboBox_Parity.addItem("")
        self.horizontalLayout_5.addWidget(self.comboBox_Parity)
        self.verticalLayout.addLayout(self.horizontalLayout_5)
        self.horizontalLayout_7 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_7.setObjectName("horizontalLayout_7")
        self.label_CTS = QtWidgets.QLabel(self.layoutWidget)
        self.label_CTS.setMaximumSize(QtCore.QSize(60, 16777215))
        self.label_CTS.setObjectName("label_CTS")
        self.horizontalLayout_7.addWidget(self.label_CTS)
        self.comboBox_FlowCtrl = QtWidgets.QComboBox(self.layoutWidget)
        self.comboBox_FlowCtrl.setObjectName("comboBox_FlowCtrl")
        self.comboBox_FlowCtrl.addItem("")
        self.comboBox_FlowCtrl.addItem("")
        self.comboBox_FlowCtrl.addItem("")
        self.horizontalLayout_7.addWidget(self.comboBox_FlowCtrl)
        self.verticalLayout.addLayout(self.horizontalLayout_7)
        self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox.setGeometry(QtCore.QRect(250, 20, 871, 471))
        self.groupBox.setObjectName("groupBox")
        self.textBrowserRecvArea = QtWidgets.QTextBrowser(self.groupBox)
        self.textBrowserRecvArea.setGeometry(QtCore.QRect(10, 20, 851, 441))
        self.textBrowserRecvArea.setObjectName("textBrowserRecvArea")
        self.groupBox_2 = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox_2.setGeometry(QtCore.QRect(250, 500, 871, 161))
        self.groupBox_2.setObjectName("groupBox_2")
        self.lineEdit_SendData = QtWidgets.QLineEdit(self.groupBox_2)
        self.lineEdit_SendData.setGeometry(QtCore.QRect(10, 20, 851, 51))
        self.lineEdit_SendData.setObjectName("lineEdit_SendData")
        self.BtnSendData = QtWidgets.QPushButton(self.groupBox_2)
        self.BtnSendData.setGeometry(QtCore.QRect(10, 80, 71, 71))
        self.BtnSendData.setObjectName("BtnSendData")
        self.groupBox_3 = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox_3.setGeometry(QtCore.QRect(10, 500, 221, 161))
        self.groupBox_3.setObjectName("groupBox_3")
        self.BtnClearRecv = QtWidgets.QPushButton(self.groupBox_3)
        self.BtnClearRecv.setGeometry(QtCore.QRect(10, 20, 201, 61))
        self.BtnClearRecv.setObjectName("BtnClearRecv")
        self.BtnClearSend = QtWidgets.QPushButton(self.groupBox_3)
        self.BtnClearSend.setGeometry(QtCore.QRect(10, 90, 201, 61))
        self.BtnClearSend.setObjectName("BtnClearSend")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1135, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.comboBox_Baudrate.setCurrentIndex(8)
        self.comboBox_ByteSize.setCurrentIndex(3)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.groupBox_ComSettings.setTitle(_translate("MainWindow", "串口设置"))
        self.BtnOpenPort.setText(_translate("MainWindow", "打开串口"))
        self.BtnClosePort.setText(_translate("MainWindow", "关闭串口"))
        self.BtnScanPort.setText(_translate("MainWindow", "扫描端口"))
        self.label_ComPort.setText(_translate("MainWindow", "串  口"))
        self.label_Baudrate.setText(_translate("MainWindow", "波特率"))
        self.comboBox_Baudrate.setCurrentText(_translate("MainWindow", "115200"))
        self.comboBox_Baudrate.setItemText(0, _translate("MainWindow", "2400"))
        self.comboBox_Baudrate.setItemText(1, _translate("MainWindow", "4800"))
        self.comboBox_Baudrate.setItemText(2, _translate("MainWindow", "9600"))
        self.comboBox_Baudrate.setItemText(3, _translate("MainWindow", "14400"))
        self.comboBox_Baudrate.setItemText(4, _translate("MainWindow", "19200"))
        self.comboBox_Baudrate.setItemText(5, _translate("MainWindow", "38400"))
        self.comboBox_Baudrate.setItemText(6, _translate("MainWindow", "56000"))
        self.comboBox_Baudrate.setItemText(7, _translate("MainWindow", "57600"))
        self.comboBox_Baudrate.setItemText(8, _translate("MainWindow", "115200"))
        self.comboBox_Baudrate.setItemText(9, _translate("MainWindow", "128000"))
        self.comboBox_Baudrate.setItemText(10, _translate("MainWindow", "256000"))
        self.comboBox_Baudrate.setItemText(11, _translate("MainWindow", "230400"))
        self.comboBox_Baudrate.setItemText(12, _translate("MainWindow", "1000000"))
        self.comboBox_Baudrate.setItemText(13, _translate("MainWindow", "2000000"))
        self.comboBox_Baudrate.setItemText(14, _translate("MainWindow", "3000000"))
        self.label_ByteSize.setText(_translate("MainWindow", "数据位"))
        self.comboBox_ByteSize.setCurrentText(_translate("MainWindow", "8"))
        self.comboBox_ByteSize.setItemText(0, _translate("MainWindow", "5"))
        self.comboBox_ByteSize.setItemText(1, _translate("MainWindow", "6"))
        self.comboBox_ByteSize.setItemText(2, _translate("MainWindow", "7"))
        self.comboBox_ByteSize.setItemText(3, _translate("MainWindow", "8"))
        self.label_Stopbits.setText(_translate("MainWindow", "停止位"))
        self.comboBox_Stopbits.setItemText(0, _translate("MainWindow", "1"))
        self.comboBox_Stopbits.setItemText(1, _translate("MainWindow", "1.5"))
        self.comboBox_Stopbits.setItemText(2, _translate("MainWindow", "2"))
        self.label_Parity.setText(_translate("MainWindow", "校验位"))
        self.comboBox_Parity.setItemText(0, _translate("MainWindow", "None"))
        self.comboBox_Parity.setItemText(1, _translate("MainWindow", "Odd"))
        self.comboBox_Parity.setItemText(2, _translate("MainWindow", "Even"))
        self.comboBox_Parity.setItemText(3, _translate("MainWindow", "Mark"))
        self.comboBox_Parity.setItemText(4, _translate("MainWindow", "Space"))
        self.label_CTS.setText(_translate("MainWindow", "流  控"))
        self.comboBox_FlowCtrl.setItemText(0, _translate("MainWindow", "None"))
        self.comboBox_FlowCtrl.setItemText(1, _translate("MainWindow", "RTS/CTS"))
        self.comboBox_FlowCtrl.setItemText(2, _translate("MainWindow", "XON/XOFF"))
        self.groupBox.setTitle(_translate("MainWindow", "接收区"))
        self.groupBox_2.setTitle(_translate("MainWindow", "发送区"))
        self.BtnSendData.setText(_translate("MainWindow", "发送数据"))
        self.groupBox_3.setTitle(_translate("MainWindow", "收/发控制"))
        self.BtnClearRecv.setText(_translate("MainWindow", "清空接收区"))
        self.BtnClearSend.setText(_translate("MainWindow", "清空发送区"))

COM9接到了树莓派Pico(Raspberry Pi Pico)的串口上,串口小工具发送的数据会通过树莓派Pico接收后再转发给串口小工具

Raspberry Pi Pico代码

from machine import Pin,UART
import utime
uart0 = UART(0, baudrate=115200, bits=8, parity=None, stop=1, tx=Pin(16), rx=Pin(17), )
#uart0.deinit()
txData = b'hello world\r\n'
rxData = bytes()

while True:
    while uart0.any() > 0:
        rxData = uart0.readline()
        uart0.write(rxData)
        print(rxData.decode('utf-8'))        
    utime.sleep(0.2)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159575.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java 基础练习 圆的面积

问题描述给定圆的半径r&#xff0c;求圆的面积。输入格式输入包含一个整数r&#xff0c;表示圆的半径。输出格式输出一行&#xff0c;包含一个实数&#xff0c;四舍五入保留小数点后7位&#xff0c;表示圆的面积。说明&#xff1a;在本题中&#xff0c;输入是一个整数&#xff…

Oracle通过数据库链连接KingbaseES

测试环境&#xff1a; ip数据库版本192.168.254.135oracle 11g192.168.254.137V008R006C005B0023 通过oracle官网得知&#xff0c;Oracle使用DG4ODBC作为连接到其他非Oracle数据库的数据网关。其原理图如下&#xff1a; 所以我们需要在Oracle服务器安装unixODBC和KingbaseES的O…

4 位硬科技创始人对谈 DevOps 硬件实战

随着 DevOps 技术更为广泛地在各行各业应用&#xff0c;从公司层面来看&#xff0c;考察的不仅仅是 DevOps 平台的技术&#xff0c;更多的是 DevOps 平台与企业产品的兼容性与企业文化能否为 DevOps 提供落地的土壤&#xff0c;这背后是商业模式、思维方式、管理理念的一系列变…

【项目实战】一文讲解车企是如何做HTTPS双向认证的

一、背景 很多主机厂都说需要做HTTPS的双向认证&#xff0c;那到底什么是双向认证呢&#xff1f; 二、什么是Https的双向认证&#xff1f; 英文是Mutual TLS HTTPS双向认证是一种安全通信方式&#xff0c;它需要在客户端和服务端之间进行双向身份验证。在这种方式中&#x…

2.浅谈计算机系统(硬件+软件)。

一、现代计算机系统是由哪两部分组成的&#xff1f;1.什么是物联网&#xff1f;2.有些计算机是非常复杂的。二、计算机系统简介。计算机系统的构成&#xff08;硬件、软件&#xff09;。三、软件。1.系统软件。2.应用软件。思维导图是清菡本人所画。一、现代计算机系统是由哪两…

C#上位机基础学习_基于SOCKET实现与PLC服务器的TCP通信(一)

C#上位机基础学习_基于SOCKET实现与PLC服务器的TCP通信(一) 测试软件: TIA PORTAL V15.1 S7-PLCSIM ADVANCED V3.0 Visual Studio 2019 如下图所示,打开S7-PLCSIM ADVANCED V3.0仿真软件,新键一个实例,设置仿真PLC的IP地址等参数,然后点击Start激活PLC, 如下图所示,…

蓝牙耳机怎么连接电脑?无线耳机连接电脑的教程

想要减少噪音&#xff0c;更好地聆听音乐&#xff0c;或者是看电视&#xff0c;很多人都会选择戴耳机。其中蓝牙耳机成为越来越多人的选择&#xff0c;它方便携带&#xff0c;没有有线的缠绕。 可能有人会问&#xff1a;无线蓝牙耳机可以连接电脑吗&#xff1f;当然可以。可是…

【3 - 数据预处理】菜菜sklearn机器学习

课程地址&#xff1a;《菜菜的机器学习sklearn课堂》_哔哩哔哩_bilibili 第一期&#xff1a;sklearn入门 & 决策树在sklearn中的实现第二期&#xff1a;随机森林在sklearn中的实现第三期&#xff1a;sklearn中的数据预处理和特征工程第四期&#xff1a;sklearn中的降维算法…

前端使用xlsx-js-style导出Excel文件并修饰单元格样式

xlsx-js-style安装引入需要导出的数据源将数据源转成需要的二维数组定义 Excel 表头将定义好的表头添加到 body 中将二维数组转成 sheet!merges 设置单元格合并!cols 设置列宽!rows 设置行高创建虚拟的 workbook向 workbook 中添加 sheet导出 workbook完整示例效果图总结安装 …

elasticsearch实现简单的脚本排序(script sort)

文章目录1、背景2、分析3、构建数据3.1 mapping3.2 插入数据4、实现4.1 根据省升序排序4.1.1 dsl4.1.2 运行结果4.2 湖北省排第一4.2.1 dsl4.2.2 运行结果4.3 湖北省排第一&#xff0c;其余省升序排序&#xff0c;按照年龄倒序4.3.1 dsl4.3.2 java代码4.3.3 运行结果5、完整代码…

【自学Python】Python逻辑运算符

Python逻辑运算符 Python逻辑运算符教程 在 Python 中&#xff0c;逻辑运算符用于连接多个条件&#xff08;一般来讲就是关系表达式&#xff09;&#xff0c;最终的结果是一个 bool 值。Python 的逻辑运算符主要包括 and&#xff08;逻辑与&#xff09;、or&#xff08;逻辑或…

ArcGIS基础实验操作100例--实验88按距离分配空间

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 空间分析篇--实验88 按距离分配空间 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&am…

[白嫖]利用百度图片缓存规则作为图床

利用百度图片缓存规则作为图床先看一张图片&#xff1a;这张图片引用了百度的图片服务器&#xff1a;https://gimg2.baidu.com/image_search/srcpicx.zhimg.com/v2-a6f0db9230a0e4b67e70524217e009fe_1440w.jpg&app2020但实际上这张图片的源站在知乎&#xff1a;https://pi…

Nginx与LUA(2)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e;除了反向代理&#xff0c;Nginx另一个主要的功能就是「负载均衡」。所谓负载均衡&#xff0c;就是将请求分摊到多个服务器上执行&#xff0c;从而减轻单台服务器的…

使用 ADManager Plus 管理Microsoft 365许可证

作为 Microsoft 365 管理员&#xff0c;管理用户的 Microsoft 365 许可证&#xff0c;为新员工分配适当的 Microsoft 365 许可证&#xff0c;在员工离开组织时释放 Microsoft 365 许可证&#xff0c;以及将释放的许可证重新分配给其他用户&#xff0c;构成了日常活动的重要组成…

YGG 在 Branch.gg 的免费游戏 Castaways 中购买了 Genesis NFT

YGG 在 Branch.gg 的第一款免费 web3 游戏 Castaways 中购买了 NFT 资产。Branch.gg 是一家开发开放世界沙盒大型多人在线游戏&#xff08;MMO&#xff09;的游戏初创公司&#xff0c;玩家通过合作来确保他们的生存。 在公开市场购买时&#xff0c;YGG 已经获得了 1,000 个 Cas…

ShareSDK 常见问题

QQ-分享报错901111&#xff0c;9001010等 由于QQ现在需要审核后才可以分享&#xff08;之前分享不需要审核&#xff09;&#xff0c;所以此错误解决方法只需通过腾讯开放平台的审核即可&#xff0c;另外要检查注册好的应用的基本信息&#xff0c;包名、md5签名和Bundle id是不…

上半年要完成的博客50

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

C++ 优先级队列的vector实现

前段时间在研究Astar算法&#xff0c;里面涉及到几个重要的知识点&#xff0c;链表数据结构、优先队列数据结构&#xff0c;在以前的工作中没有接触到&#xff0c;学习后发现真是好东西&#xff0c;对C的认知更深了一步&#xff0c;不废话了&#xff0c;下面正文&#xff1a; …

【正点原子FPGA连载】第十一章U-Boot使用实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十一章U-Boot使…