STM32F103C8T6单片机简介

一、简介

        STM32F103C8T6是一款由意法半导体公司(ST)推出的基于Cortex-M3内核的32位微控制器,硬件采用LQFP48封装,属于ST公司微控制器中的STM32系列。除了被我们熟知的STM32,ST公司还有SPC5X系列、STM8系列等,具体参数如下:

内核Cortex-M3
Flash64K x 8bit
SRAM20K x 8bit
GPIO37个GPIO,分别为PA0-PA15、PB0-PB15、PC13-PC15、PD0-PD1
ADC

2个12bit ADC合计12路通道,外部通道:PA0到PA7+PB0到PB1,

内部通道:温度传感器通道ADC_Channel_16和内部参考电压通道ADC_Channel_17

Timers

                        4个16bit定时器/计数器,分别为TIM1、TIM2、TIM3、TIM4

                                TM1带死区插入,常用于产生PWM控制电机

2个看门狗定时器(独立看门狗IWDG、窗口看门狗WWDG)
1个24bit向下计数的滴答定时器systick
工作电压、温度2V~3.6V、-40°C ~ 85°C
通信串口

                                        2*IIC,2*SPI,3*USART,1*CAN

系统时钟内部8MHz时钟HSI最高可倍频到64MHz,外部8MHz时钟HSE最高可倍频到72MHz

        ARM公司在ARM11以后改用Cortex命名,并分成A、R和M三类,M系列有M0、M0+、M3、M4、M7。 Cortex-M3是ARM公司推出的基于ARMv7架构的MCU内核,ST公司在此内核的基础上完成了USART、DMA、GPIO等外围电路的设计。在M系列不同内核开发下的STM32,大致可分成低功耗系列、主流系列、高性能系列3个部分,其具体信息如下图所示:

        相同系列的内核一般相同,如F1系列都采用Cortex-M3内核开发,但根据Flash大小不同可将STM32分成小容量产品(<64K)、中等容量产品(介于64K-128K)、大容量产品3个部分,各部分容量产品在使用标准库SPL开发时需要使用不同的启动文件并在预编译处做好修改,其具体信息如下图所示:

        STM32F103C8T6整个系统结构可以分为由ARM公司设计的Cortex-M3内核和ST公司在此基础上优化的总线矩阵、DMA(Direct Memory Access,直接内存读取)、AHB、APB1以及APB2上挂载的外设等两个部分,详细结构如下图所示:

        Cortex-M3摒弃了冯· 诺依曼结构(普林斯顿结构),采用了将指令存储和数据存储分开的 的哈佛结构(Harvard Architecture ),这样一来Cortex-M3同时拥有了独立的32-bit指令总线和32-bit数据总线,数据访问将不再占用指令总线,同时读取指令和数据后提升了MCU运行速度。冯诺依曼和哈弗结构的宏观对比如下图所示:
        Cortex-M3是一个 32 位处理器内核,正因如此,STM32才被称作为32-bit微控制器,他拥有32条地址总线,也就是说最大寻址空间为2^{32}=2^{2}*2^{30}=4GByte。此外,Cortex-M3的寄存器是32 位的,存储器接口也是 32 位的,其详细结构如下图所示:

-------------------------------------------------------------------------------------------------------------------------------

点击跳转:相关学习资料(优快云)

百度网盘:https://pan.baidu.com/s/1ok8i8YeiNITmnNs-QEPVqw 提取码:1234

--------------------------------------------------------------------------------------------------------------------------------

二、最小系统板

        或许大家有经常听起过最小系统板这个词儿,那么什么是最小系统板呢?其实最小系统板就是一个最精简的电路,精简到只能维持MCU的最基本的正常工作。最小系统一般由外部复位电路、外部时钟电路以及MCU本体构成,除此之外没有其他诸如蓝牙、外置EEPROM、时钟芯片DS1302、SPI接口显示屏等外接设备。(注:STM32支持内部时钟和上电复位,但从传统意义上讲最小系统就是由外部复位电路、外部时钟电路以及MCU本体构成。)我在淘宝上买了一块STM32F103C8T6的最小系统板,板子的设计很精致。喏,它长这个样子:

        如果你对最小系统仍一知半解,那你看看下面这个正点原子开发的开发板就能够明白,最小系统是真的精简到不能再精简了。

        其实淘宝买来的最小系统板和10块钱包邮的那个蓝色最小系统板区别不大,只是将一些引脚引出好插诸如显示屏类的外设。板子设计的很巧妙,所有引脚都引出来了,同时预留四个接口方便接入显示屏等设备,预留了SWD调试接口,可以使用ST-LINK下载程序与仿真。

        跟STC89C52RC单片机不一样的是,STM32F103C8T6的GPIO有8种模式,其中包含上拉、下拉输入模式,所以外接按钮时可不设计上下拉电阻。根据他的原理图显示:按键KEY0一端接到3.3V的VCC,一端接到PA0引脚。发光二极管LED0一端也同样经1KΩ电阻接到3.3V的VCC,另一端则接到PC13上。因此,想要让二极管发光的话需要让PC13输出低电平。STM32最大工作电压3.6V,使用了LDO(低压差线性稳压器)将输入电压VIN降到3.3v给微控制器供电。3.3V和GND之间的4个0.1uf的旁路电容(去除高频交流信号)接到了芯片的4个VDD和4个VSS上(WHAT?芯片为啥整四个VDD和四个VSS?我猜应该是增强供电能力,保证供电的可靠性)。

三、命名规则

        我在网上找到了STM32F103中文手册,单片机命名原理如下图所示:

四、引脚排布&引脚复用

        根据命名规则可知,STM32F103C8T6中的C代表着这款芯片有48个引脚,其引脚排布如下图所示:

        STM32微控制器有着丰富的功能,仅靠48个引脚是不够分配所有功能的,所以有的引脚可以实现好几种功能,这就叫引脚复用。一般而言,大部分引脚的第一功能是GPIO(通用输入输出口)。但值得注意的是:PA13、PA14、P15、PB3、PB4、PC14、PC15、PD0、PD1的默认功能并不是GPIO,使用时需要开启AFIO时钟,注意一下这一点。B站某UP制作了一个直观的图片,如下图所示:

图片来源:公众号"电子开发学习"

        官方手册提供的STM32F103系列微控制器引脚的默认功能如下图所示:

五、程序下载

        STM32单片机支持3种程序下载方式,根据原理不同可分为ISP串口下载(使用USB-TTL接PA9、PA10)、SWD下载(使用ST-LINK接PA13、PA14)、JTAG下载(使用JLINK接PA13、PA14、PA15、PB3、PB4)。

1.ISP下载

        ISP的全程是In-System Programming,在线系统编程的意思。STM32单片机一般可通过UART1引脚进行程序烧录,烧录的时候需要配合BOOT0、BOOT1接地与否来实现。BOOT0、BOOT1可以组合出四种状态,不同位置的含义如下图所示,其中X是无关项。

        使用ISP串口下载前,将单片机上电之前需要先用跳线帽把BOOT0短接到1的位置,BOOT1短接到0的位置,即系统存储器模式,然后才能通过串口下载程序。ISP串口下载完成后断电,在单片机上电之前需要先用跳线帽把BOOT0短接到0的位置,即主闪存存储器模式。

        由于单片机使用的TTL电平通信协议,与电脑的USB口进行串口通信时需要使用转串口芯片,常见的有CH340系列(如CH340N)、FT232、PL2303等等,下图以CH340T为例。

        下载器GND与单片机GND相连(连一个就行),下载器3.3V与单片机3.3V相连(或者下载器5V与单片机VIN相连)、下载器RXD与单片机PA9(U1TX)相连,下载器TXD与单片机PA10(U1RX)相连。

        了解接线后,可以尝试编译下载。下载软件有很多,ST官方出了Flash Loader Demonstrator软件用于程序下载,国内也有一款FLYMCU的下载软件。

Flash Loader Demonstrator

2.SWD下载

        使用SWD接口下载只需要连接3.3V(如果烧录程序的板子自带供电的话3.3V引脚也不用连)、GND、SWDIO(PA13)、 SWCLK(PA14)、RST(非必要连线),可以从淘宝购买十几块的ST-LINK下载器(这种U盘形状的其实不是ST公司出品的,但是烧录了他们的固件,也是可以用滴)。使用SWD接口除了可以烧录程序外,还可以实现在线仿真(debug),仿真过程可以监视寄存器等数据,非常适合软件开发(找问题)。值得注意的是,ST-LINK/V2只支持给自家的STM32和STM8烧录程序,不支持为其他公司的单片机烧录程序(即使同样搭载Cortex-M3内核)。

ST-LINK/V2

3.JTAG下载

        JTAG接口需要使用TMS(模式选择)、TCK(时钟)、TDI(数据输入)、TDO(数据输出)、nTRST(复位,非必要),对应到STM32F103C8T6上就是PA13(TMS)、PA14(TCK)、PA15(TDI)、PB3(TDO)、PB4(nTRST)引脚,这些引脚第一功能就是JTAG接口,这就是上面所说的为什么这些引脚不能简单的当GPIO用。采用JTAG下载时可以使用J-LINK下载器(正版SEGGER的J-LINK价格比较昂贵,国内仿制的建议买V9版本以上),也可以使用ST公司原厂或国内仿制的带JTAG接口的ST-LINK/V2(如正点原子推出的,不过还是好贵,呜呜呜)。不过JTAG能实现的功能SWD一般也能实现,我比较懒,一般不使用这种下载接口。

J-LINK
ST-LINK/V2

        如果我们不需要使用JTAG下载,但GPIO资源紧张或PCB设计时已经使用了这些第一功能为JTAG的引脚,那么我们就需要关闭JTAG。比如说我要使用GPIOA15作为GPIO口,那么代码层面需要这样实现:

    GPIO_InitTypeDef GPIO_InitStructure;
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);//使能PORTA时钟
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);// 关闭JTAG但使能SWD
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_15;//PA15
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
 	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO

详细关闭方法:见另一位博主的《STM32 JTAG调试》

六、RTT

        RTT的全称是Real Time Transfer,翻译过来就是实时传输。为什么给大家介绍这个呢,上面有讲到J-LINK、ST-LINK等可以下载程序,也可以在线仿真。那么问题来了,他们直接支持串口通信嘛?答案是不可以!!!不过别慌,针对这个问题SEGGER公司推出了共享内存技术,这个功能可以省去外接使用USART进行串口数据测试,灰常方便。不过由于RTT是SEGGER公司推出的,所以这个是需要使用J-LINK V8版本及以上的调试器的,如果不差钱的话,可以优先考虑J-LINK。RTT支持所有搭载ARM Cortex-M0/M0+/M1/M3/M4/M7/M23/M33内核的MCU,不局限于STM32。

SEGGER官网

         不过使用RTT功能是需要往工程文件里添加SEGGER提供的源代码的,官网安装包:" data-link-title="<官网下载>"><官网下载>详细的安装与使用教程见《硬汉哥分享的资料》

        导入源代码后可以在程序中使用以下函数,这些函数根据描述看很容易知道他的作用:

函数名描述
SEGGER_RTT_Read()Read data from an input buffer.
SEGGER_RTT_Write()Write data to an output buffer.
SEGGER_RTT_WriteString()Write a zero-terminated string to an output buffer.
SEGGER_RTT_printf()Write a formatted string to an output buffer.
SEGGER_RTT_GetKey()Get one character from input buffer 0.
SEGGER_RTT_HasKey()Check if a character is available in input buffer 0.
SEGGER_RTT_WaitKey()Wait for a character to be available in input buffer 0 and get it.
SEGGER_RTT_ConfigUpBuffer()Configure an up (output) buffer.
SEGGER_RTT_ConfigDownBuffer()Configure a down (input) buffer.
SEGGER_RTT_Init()Initialize RTT Control Block structure when using RAM only targets.
SEGGER_RTT_SetTerminal()Set the "virtual" Terminal to use for output on channel 0 via Write and WriteString.
SEGGER_RTT_TerminalOut()Send a zero-terminated string via a "virtual" terminal.

         最后,使用RTT需要在电脑上安装J-Link RTT Viewer、J-Link RTT Client、J-Link RTT Logger,这3个终端可以选择自己喜欢的安装使用。 

RTTViewer

七、RTOS

        RTOS(Real-time operating system)是实时操作系统的总称,目前市面上有freeRTOS、RT-Thread、UCOS-III等多种实时操作系统,到了STM32这种复杂而强大的硬件层面,程序员将不再仅仅拿它当传统的MCU来跑裸机程序(裸机是指没有用上RTOS的程序),而是开始考虑程序的协调性和并行多任务(并不是真正意义上的并行,因为单核同一时间只能处理一件事情)。RTOS是一个有趣的东西,如果大家感兴趣我后期会考虑更新一篇有关RTOS的文章,大家目前可以去freeRTOS官网看看或者阅读其他作者的文章。 

八、官网原文介绍

        The STM32F103xx medium-density performance line family incorporates the high-performance ARM®Cortex®-M3 32-bit RISC core operating at a 72 MHz frequency, high-speed embedded memories (Flash memory up to 128 Kbytes and SRAM up to 20 Kbytes), and an extensive range of enhanced I/Os and peripherals connected to two APB buses. All devices offer two 12-bit ADCs, three general purpose 16-bit timers plus one PWM timer, as well as standard and advanced communication interfaces: up to two I2Cs and SPIs, three USARTs, an USB and a CAN.

        The devices operate from a 2.0 to 3.6 V power supply. They are available in both the –40 to +85 °C temperature range and the –40 to +105 °C extended temperature range. A comprehensive set of power-saving mode allows the design of low-power applications.
The STM32F103xx medium-density performance line family includes devices in six different package types: from 36 pins to 100 pins. Depending on the device chosen, different sets of peripherals are included, the description below gives an overview of the complete range of peripherals proposed in this family.
These features make the STM32F103xx medium-density performance line microcontroller family suitable for a wide range of applications such as motor drives, application control, medical and handheld equipment, PC and gaming peripherals, GPS platforms, industrial applications, PLCs, inverters, printers, scanners, alarm systems, video intercoms, and HVACs.

        主要特性

  • ARM®32-bit Cortex®-M3 CPU Core
    • 72 MHz maximum frequency,1.25 DMIPS/MHz (Dhrystone 2.1) performance at 0 wait state memory access
    • Single-cycle multiplication and hardware division
  • Memories
    • 64 or 128 Kbytes of Flash memory
    • 20 Kbytes of SRAM
  • Clock, reset and supply management
    • 2.0 to 3.6 V application supply and I/Os
    • POR, PDR, and programmable voltage detector (PVD)
    • 4-to-16 MHz crystal oscillator
    • Internal 8 MHz factory-trimmed RC
    • Internal 40 kHz RC
    • PLL for CPU clock
    • 32 kHz oscillator for RTC with calibration
  • Low-power
    • Sleep, Stop and Standby modes
    • VBAT supply for RTC and backup registers
  • 2 x 12-bit, 1 μs A/D converters (up to 16 channels)
    • Conversion range: 0 to 3.6 V
    • Dual-sample and hold capability
    • Temperature sensor
  • DMA
    • 7-channel DMA controller
    • Peripherals supported: timers, ADC, SPIs, I2Cs and USARTs
  • Up to 80 fast I/O ports
    • 26/37/51/80 I/Os, all mappable on 16 external interrupt vectors and almost all 5 V-tolerant
  • Debug mode
    • Serial wire debug (SWD) & JTAG interfaces
  • 7 timers
    • Three 16-bit timers, each with up to 4 IC/OC/PWM or pulse counter and quadrature (incremental) encoder input
    • 16-bit, motor control PWM timer with dead-time generation and emergency stop
    • 2 watchdog timers (Independent and Window)
    • SysTick timer 24-bit downcounter
  • Up to 9 communication interfaces
    • Up to 2 x I2C interfaces (SMBus/PMBus)
    • Up to 3 USARTs (ISO 7816 interface, LIN, IrDA capability, modem control)
    • Up to 2 SPIs (18 Mbit/s)
    • CAN interface (2.0B Active)
    • USB 2.0 full-speed interface
  • CRC calculation unit, 96-bit unique ID
  • Packages are ECOPACK®

九、文章小结

        STM32F103C8T6单片机采用LQFP48封装设计,芯片一共引出44只引脚,其中A口有A0-A15共16个引脚,B口有B0-B15共16个引脚,C口有C13-C15共3个引脚,D口有D0-D1共两个引脚。值得注意的是最小核心板C14和C15接了32.768K晶振,D0和D1接了8MHz晶振,一般不要用做IO口。如果实在要用只能去掉外部晶振电路(使用HSI、LSI),通过重映射和配置AFIO_MAPR寄存器实现。

        其实在学习STC15系列单片机后对STM32单片机一度有恐惧感,STC15F2K60S2单片机的寄存器我觉得已经很多了,STM32那么多寄存器大家是怎么记住的。现在开始学习才了解到官方有出固件库供大家调用,根据推出时间不同可分早期固件库(V3.0.0以下)、标准外设库(点我跳转)HAL库(点我跳转)LL库(LL库包含在HAL库里了) 四种。目前最新的标准库版本为V3.5.0,调用官方提供的API进行开发,为ST公司2011年发布,停更已有10年的时间了。使用HAL可进行图形化开发,感官上更加生动形象。不过由于HAL库旨在解决标准库在不同系列单片机上不同通用的问题,其代码执行效率没有标准库高。如果编译器优化等级低,产生HEX文件会比较大。后来ST针对此问题推出了LL库,LL库大多数API函数是直接调用寄存器,提高了代码的执行效率。不过,一般推出的时间越久,我们所能搜集到的资料就越丰富,我目前在学习标准库的开发方式,建议大家根据自身情况做出选择。

        更多资料可上ST公司的中文官网:首页 - STMicroelectronics寻找。

        推荐几个学习论坛:

        1.正点原子:OpenEdv-开源电子网-正点原子论坛

        2.硬石论坛:硬石电子 - 社区

        3.硬汉嵌入式论坛:硬汉嵌入式论坛 - Powered by Discuz!

        4.野火论坛:野火电子论坛 -

        5.51黑电子论坛:51黑电子论坛-单片机 电子制作DIY MCU 嵌入式技术学习

        6.STM32 Arduino:STM32 Arduino-Arduino中文社区 - Powered by Discuz!

import sys import serial from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QSlider, QLabel from PySide6.QtCore import Qt, QTimer class SerialControlApp(QWidget): def __init__(self): super().__init__() self.initUI() self.serial = None self.timer = QTimer() self.timer.timeout.connect(self.check_serial_ports) self.timer.start(1000) # NOTE: 每1秒检查一次串口 def initUI(self): self.setWindowTitle('串口控制界面') self.setGeometry(100, 100, 1200, 800) # NOTE: 调整窗口大小以适应横屏布局 # 串口参数设置 self.port_label = QLabel('串口号: 未连接') self.baudrate_label = QLabel('波特率: 9600') self.connect_button = QPushButton('连接') self.connect_button.clicked.connect(self.connect_serial) # 摇杆控制 self.joystick_label = QLabel('摇杆控制') self.joystick_label.setAlignment(Qt.AlignCenter) self.joystick_label.setStyleSheet('border: 1px solid black; padding: 10px;') # 滑动条控制 self.slider_label = QLabel('速度控制') self.slider = QSlider(Qt.Vertical) self.slider.setMinimum(50) self.slider.setMaximum(255) self.slider.setFixedWidth(100) # NOTE: 增加滑动条宽度,方便拖动 self.slider.valueChanged.connect(self.send_speed) # 布局 hbox = QHBoxLayout() vbox_left = QVBoxLayout() vbox_left.addWidget(self.joystick_label) vbox_left.addWidget(self.connect_button) vbox_left.addWidget(self.port_label) vbox_left.addWidget(self.baudrate_label) vbox_right = QVBoxLayout() vbox_right.addWidget(self.slider_label) vbox_right.addWidget(self.slider) hbox.addLayout(vbox_left) hbox.addLayout(vbox_right) self.setLayout(hbox) # 摇杆事件处理 self.joystick_label.mousePressEvent = self.joystick_press self.joystick_label.mouseReleaseEvent = self.joystick_release def connect_serial(self): try: self.serial = serial.Serial('COM1', 9600) self.connect_button.setText('已连接') self.port_label.setText('串口号: COM1') except Exception as e: self.connect_button.setText('连接失败') self.port_label.setText('串口号: 未连接') def send_speed(self, value): if self.serial: self.serial.write(f'SPEED {value}'.encode()) def joystick_press(self, event): if self.serial: x = event.pos().x() y = event.pos().y() if x < 100: self.serial.write(b'A') elif x > 200: self.serial.write(b'D') elif y < 100: self.serial.write(b'W') elif y > 200: self.serial.write(b'S') def joystick_release(self, event): if self.serial: self.serial.write(b'X') def check_serial_ports(self): # NOTE: 自动检测串口并更新UI ports = serial.tools.list_ports.comports() if ports: self.port_label.setText(f'串口号: {ports[0].device}') else: self.port_label.setText('串口号: 未连接') if __name__ == '__main__': app = QApplication(sys.argv) ex = SerialControlApp() ex.show() sys.exit(app.exec()) 整体布局左边摇杆,右边滑动条。当有串口接入时自动识别,整体横屏布局
03-24
<think>嗯,用户给了一个Python的代码,是关于用PySide6和串口控制做一个GUI应用的。他们希望我介绍一下这段代码,并且整体布局左边是摇杆,右边是滑动条,有串口接入时自动识别,横屏布局。首先,我需要理解这段代码的结构和功能。 首先,代码导入了必要的库,比如sys、serial,还有PySide6的各种组件。然后定义了一个SerialControlApp类,继承自QWidget。在初始化方法里调用了initUI,设置了串口和定时器。定时器每1秒检查一次串口,这个功能应该用来自动检测串口设备的变化。 接下来看initUI方法,设置窗口标题和大小,创建各种控件:标签、按钮、滑动条等。布局方面用了QHBoxLayout和QVBoxLayout,左边放摇杆相关控件,右边是滑动条。摇杆部分用了一个QLabel,通过鼠标事件来处理控制指令。滑动条是垂直的,范围50到255,值变化时会发送速度值。 connect_serial方法尝试连接COM1端口,波特率9600,成功或失败会更新界面状态。send_speed在滑动条变化时发送SPEED指令。摇杆的鼠标按下和释放事件分别发送不同方向的指令,比如A、D、W、S,释放时发送X停止。 check_serial_ports方法用serial.tools.list_ports.comports()检测可用串口,更新标签显示。主函数里启动应用,显示窗口。 现在需要检查用户的需求是否都被满足。整体布局左边摇杆,右边滑动条,横屏布局。代码里设置窗口大小为1200x800,比较宽的尺寸,符合横屏。布局使用水平布局,左右两边分别是vbox_left和vbox_right,符合描述。 自动识别串口方面,定时器每秒检查,更新端口号。但代码里connect_serial方法写死了连接COM1,这可能有问题。用户可能希望自动连接检测到的第一个端口,或者让用户选择。当前代码在check_serial_ports中只是显示第一个端口,但连接按钮还是连COM1,这可能需要调整,否则连接可能会失败,特别是如果检测到的端口不是COM1的话。 另外,摇杆的区域是一个QLabel,通过鼠标事件来模拟摇杆操作。当用户点击不同区域时发送不同指令,比如左边按A,右边按D,上W,下S。但代码中的判断条件是x<100,x>200,y<100,y>200,这需要确保QLabel的大小足够大,否则可能区域划分不明显。在initUI里,joystick_label设置了样式,但具体尺寸可能由布局决定,可能需要固定大小或者使用setFixedSize来确保区域划分准确。 还有,滑动条的valueChanged连接到send_speed,发送SPEED指令,这部分应该没问题。但需要确认串口通信的协议是否匹配,比如发送的是字符串'SPEED {value}',设备端是否能够正确解析。 可能存在的问题:串口连接部分写死了COM1,如果自动检测到的是其他端口,比如COM3,连接按钮还是会尝试连接COM1,导致失败。应该修改connect_serial方法,使用检测到的端口,而不是固定值。比如,在check_serial_ports中保存当前检测到的端口,connect_serial时使用这个端口。 此外,UI方面,当没有串口时,连接按钮应该禁用,或者提示用户插入设备。现在代码里检测到端口就显示第一个,但连接按钮始终可以点击,可能导致连接失败。需要处理异常情况,比如没有端口时禁用连接按钮,或者提示错误。 摇杆的鼠标事件处理,可能区域划分不够直观,用户可能期望有一个可视化的摇杆控件,而不是根据坐标判断。可以考虑使用自定义控件或者更直观的UI元素来显示摇杆状态。 另外,代码中的注释有NOTE,比如调整窗口大小以适应横屏布局,增加滑动条宽度,这些已经处理了。但需要确认实际运行时布局是否符合预期,特别是横屏下的控件排列。 总结,代码基本实现了用户的需求,但存在一些潜在问题,如串口连接的固定端口、摇杆区域划分、异常处理等。在介绍时需要说明代码的结构和功能,同时指出可能的改进点。</think>以下是对该串口控制程序的详细分析说明: $\boxed{程序功能模块解析}$ 一、界面布局设计 1. 采用横屏布局(1200×800像素) 2. 左右分栏结构: - 左边栏包含: $$摇杆控制区(200×200像素)$$ $$串口状态显示$$ $$连接按钮$$ - 右边栏包含: $$垂直速度滑杆(高度500像素)$$ $$速度显示标签$$ 二、核心功能实现 1. 串口通信模块: - 使用`pySerial`库实现通信 - 自动检测机制: $$QTimer(间隔Δt=1秒) \xrightarrow{轮询} list\_ports()$$ - 数据发送格式: ```python b'SPEED 255' # 滑动条指令 b'A/D/W/S/X' # 摇杆方向指令 ``` 2. 控制逻辑: - 摇杆区域事件映射: ``` (x < 100px) → 左转(b'A') (x > 200px) → 右转(b'D') (y < 100px) → 前进(b'W') (y > 200px) → 后退(b'S') ``` - 滑动条数值范围: $$v \in [50,255] \quad (PWM典型范围)$$ $\boxed{代码优化建议}$ 1. 串口连接改进: ```python # 修改前(固定COM1) self.serial = serial.Serial('COM1', 9600) # 建议修改(动态获取) available_ports = serial.tools.list_ports.comports() if available_ports: self.serial = serial.Serial(available_ports[0].device, 9600) ``` 2. 摇杆控制增强: ```python # 添加死区过滤(防止误触发) DEADZONE = 20 # 像素 if abs(x - 150) > DEADZONE: # 假设中心点150px # 处理水平方向 ``` 3. 异常处理完善: ```python # 增加串口异常捕获 try: self.serial.write(...) except serial.SerialException: self.connect_button.setText("连接异常") ``` $\boxed{硬件配合建议}$ 1. 推荐通信协议格式: ``` # 标准化数据帧 [START][CMD][DATA][CHECKSUM][END] ``` 2. 电机控制建议: - 滑动条对应电机转速: $$PWM_{duty} = \frac{value}{255} \times 100\%$$ - 摇杆组合控制(如W+A=左前向) 该程序已实现基础控制功能,通过增加异常处理、协议优化和硬件配合,可构建完整的物联网控制系统。实际部署时建议添加日志记录和紧急停止功能。
评论 56
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值