实验室巡检这活儿,最枯燥的不是走两圈,而是你得记住每个点位该看什么、该记录什么。精密仪器室的温度和湿度是不是超标了、气体监测仪有没有报警、贵重设备区域有没有闲人靠近——这些在无人值守的时间段里,往往只能靠事后翻记录。我做的这个项目,就是用单片机做了一台实验室巡检遥控小车,把“巡”和“检”拆开来看:车体负责移动,传感器负责采集,无线模块负责把人从现场解放出来。整套方案从硬件选型到软件架构,再到烧录调试的坑,我都会在这篇文章里完整讲一遍。
这篇内容很适合三类人看:正在做单片机课程设计或毕业设计的同学、想系统入门嵌入式开发的初学者,以及在实验室或类似场所真有巡检需求、想低成本自己动手搞一套方案的工程师。项目本身是典型的“移动平台+无线遥控+环境感知”组合,大量用到了STM32和STC8G这类单片机上的常见外设,学完这一套,你写其他嵌入式项目会顺手很多。
1. 项目定位与整体设计思路
1.1 实验室巡检到底要“巡”什么
先别急着选芯片,得把需求吃透。实验室和家庭环境最大的区别在于:它有成套的仪器设备、严格的环境要求和较高的安全等级。我走访了一圈实际使用场景,总结出三类巡检需求:
- 环境类巡视:温度、湿度、光照、烟雾浓度是否在正常范围,尤其适合恒温恒湿机房、化学试剂储存间。
- 设备类巡视:通过摄像头或传感器判断设备指示灯状态、仪表读数、是否有异常响声。低成本方案里,摄像头可以先不做,但传感器的数据采集是必须的。
- 安全类巡视:是否存在人员闯入、门窗是否关闭等。这一步用人体红外传感器或者干簧管就能实现基础版本。
传统人工巡检的痛点是显而易见的:夜间和节假日无人值守,人工巡检频率低,纸质记录容易丢失,数据没有形成曲线。而我做的这版遥控小车,可以让人在办公室或值班室里,远程遥控车辆走到指定点位,实时读取传感器数据并自动记录,省下了大量重复劳动,也让数据有了电子化沉淀。
1.2 为什么不做全自主,而是用“遥控小车”
我调研过三条技术路线,在这里做个对比,你就明白为什么最终选“遥控小车”这个中间态。
| 方案类型 | 成本 | 实现难度 | 可靠性 | 适用场景 |
|---|---|---|---|---|
| 固定传感器节点 | 低 | 低 | 高 | 点位固定、无移动需求 |
| 全自主AGV巡检车 | 很高 | 很高 | 中 | 路径清晰、无人值守场景 |
| 单片机遥控巡检车 | 低 | 中 | 高(有人干预) | 实验室、仓储、教学场合 |
固定传感器节点的思路我第一个否了。实验室布局经常变动,设备增加、工位调整都是常事,固定节点要跟着拆了重装,非常麻烦。而移动式巡检车只要有路就能巡检,灵活性高得多。
全自主AGV方案为什么不做?核心原因是成本和技术难度完全不成比例。激光雷达、SLAM算法、路径规划,这些放在嵌入式Linux平台上才玩得转,对于一个以单片机为核心的实训项目来说,边际成本太高。而实验室巡检的现场通常有人在,完全不需要全自主,遥控操作已经能覆盖90%的需求,剩下10%留作后续扩展就好。
最终方案定为:单片机主控 + 无线遥控 + 多传感器环境采集 + 实时数据回传。这个设计既满足了巡检的核心需求,又把复杂度控制在了个人能够完整实现和迭代的范围内,对初学者是“跳一跳够得着”的水平,对老手来说又是可以快速出活的组合。
1.3 系统架构与功能模块划分
整个项目可以拆成五个模块:主控模块、执行模块、感知模块、无线模块、电源模块。
- 主控模块:核心MCU,负责所有逻辑调度、数据处理、外设控制。
- 执行模块:电机驱动芯片 + 直流减速电机 + 车轮底盘,负责移动和转向。
- 感知模块:温湿度、光照、烟雾、超声波测距、测速编码器。
- 无线模块:蓝牙/2.4G收发,负责接收遥控指令、回传传感器数据。
- 电源模块:电池组、稳压电路、滤波电容,负责全系统供电。
数据流分成两条线:下行链路是“遥控指令→无线模块→主控解析→电机驱动执行”;上行链路是“传感器采集→主控打包→无线模块回传→手机/电脑端显示”。这两条链路是相辅相成的,缺任何一条,小车就只能算“半遥控”而不是“可巡检”。
实际项目中,我给小车设计了三档工作模式:手动遥控模式(日常操作)、定点巡检模式(走到预设坐标停稳后采集数据)、急停模式(紧急情况下立即断电停车)。这些模式通过按键和遥控指令组合切换,也是后续软件架构设计的基础。
2. 硬件平台选型与核心模块拆解
2.1 主控芯片选型:为什么我从STC89C52升级到STC8G
很多初学者上来就问:用51单片机还是STM32?说实话,这项目用经典的STC89C52确实能做,但如果要用它做完所有功能,会非常痛苦——没有内置ADC,测光照和电池电压得外接ADC芯片;没有内置PWM模块,调速得靠定时器模拟;没有内置EEPROM,保存参数得外挂存储芯片。
我最终选用的是STC8G系列的单片机,比如STC8G1K17或者STC8H系列。这类芯片的最大优势是:内核是增强型8051,指令兼容,但速度大幅提升,内部时钟可达24MHz甚至更高,不需要外部晶振。芯片内部集成了10位ADC、PWM模块、EEPROM、串口、硬件I2C/SPI,一颗芯片把所有外设需求全包了,BOM成本也压得很低。
再看为什么不选4位OTP单片机。这类芯片确实存在,常用于简单家电控制,但资源极其有限,程序烧进去之后无法修改,一个项目没调通就得换片重烧,而且没有串口、没有ADC,根本撑不起多传感器巡检小车的需求。选型时记住一句话:资源够用且余量30%以上,才算选型合理。
选型时还有个接地气的因素:STC单片机的下载方案非常友好。用一颗CH340 USB转串口芯片就能搞定烧录,不需要额外买J-Link、ST-Link。STC-ISP软件的操作逻辑也简单,学习门槛明显低于STM32那一套复杂的启动配置。
2.2 电机驱动与底盘配置
底盘我用的是常见的四驱TT马达底盘,尺寸大约20cm×15cm,四个马达自带减速箱,扭矩足够带动整车和电池。如果你手头预算有限,两驱底盘加万向轮的方案也能跑,只是爬坡和越障能力弱一些,实验室的平整地面问题不大。
驱动芯片这里有一个经典的二选一:L298N和TB6612FNG。L298N价格便宜、电流能力大,但压降大、发热严重,而且模块体积大;TB6612FNG体积小、效率高、压降低,控制逻辑和L298N完全一致,我用的是后者。
| 参数 | L298N | TB6612FNG |
|---|---|---|
| 最大输出电流 | 2A/路 | 1.2A/路 |
| 导通压降 | 约2V | 约0.5V |
| 体积 | 大 | 小 |
| 电源要求 | 需要独立逻辑电源 | 逻辑电源可由主控板取 |
| 适合场景 | 大功率电机、车模 | 小型智能车、TT马达 |
驱动接线的核心要点是“共地”。所谓共地,就是电机驱动芯片的GND、主控板的GND、电池的负极必须连通,否则控制信号没有参考电平,电机要么不动,要么乱转。这个坑我见很多人踩过,第一次接线时多花一分钟确认共地,能省下后面两小时排查问题的时间。
另外还有一个防反接的细节:电池正负极接反,驱动芯片和主控芯片会瞬间“冒烟”。有条件的话,在电源入口加一颗防反接二极管或者使用带保护功能的电源模块,这一块钱的投资非常值。
2.3 无线遥控方案:蓝牙、2.4G还是红外
无线通信是遥控小车的核心,主流方案有三个,我逐个对比过:
| 方案 | 通信距离 | 双向通信 | 开发难度 | 成本 |
|---|---|---|---|---|
| 红外遥控 | ≤5米 | 不支持 | 低 | 极低 |
| 蓝牙HC-05/HC-06 | 10米左右 | 支持 | 中 | 低 |
| 2.4G NRF24L01 | 50米以上 | 支持 | 高(需要自组协议) | 中 |
红外方案最先被排除。红外遥控器有角度限制,必须对着接收头按,小车转个方向遥控就失灵了,而且红外只能单向通信,无法回传数据。这不符合巡检场景“人在办公室操控并接收数据”的需求。
NRF24L01的问题在于组协议麻烦。虽然通信距离远、双向通信好,但它的数据包格式需要自己定义传输和应答机制,调试成本高,初学者容易卡在“发送者没收到应答”这类问题上。如果你有基础,我建议后续可以升级到这个方案,但第一版先不要和它死磕。
我实际用的是蓝牙HC-05,主从一体模块,工作在从机模式,与手机配对后相当于一条无线串口线。主控芯片通过串口向HC-05发数据,手机端用蓝牙调试助手就能看到传感器巡检测量结果;反过来,手机发指令,主控串口收到的就是遥控命令。这等于把“无线通信”这件事简化成了“串口通信”,极大降低了软件复杂度。
2.4 传感器组合与选型原则
传感器选型的主张是:只选真正有巡检价值的,不要堆料。我这版的配置清单如下:
- 温湿度:DHT11,单总线协议,测量范围20%-90%RH、0-50℃,精度够用但响应慢,适合巡检场景。追求精度可以换SHT30,但协议复杂一点。
- 光照:光敏电阻配合ADC读取,成本极低,用于判断实验室灯是否关闭、窗外光照强度是否异常。
- 烟雾/可燃气体:MQ-2气敏传感器,输出模拟电压与气体浓度相关,接ADC就行。注意这类传感器需要预热几分钟才能稳定读数,开机后不要立刻采数据。
- 避障测距:HC-SR04超声波模块,在遥控模式下用于防止小车撞到仪器设备。这个模块测距不稳定,数据需要软件滤波。
- 速度反馈:马达后端加装霍尔测速码盘,用外部中断计数,用于估算小车行驶里程。这个在“定点巡检”模式里非常重要。
传感器布局有个细节:DHT11不要放在电机和电池正上方,电机和电源发热会影响温湿度读数。我一开始图省事把DHT11贴在主控板上,发现温度读数明显偏高,后来用杜邦线延长出来,放到车头位置才恢复正常。这种问题不靠资料能想到,必须实际跑过才知道。
3. 软件架构与关键代码实现
3.1 从“延时阻塞”到“状态机+非阻塞扫描”
单片机开发里最常见的问题,就是初学者所有代码都写在while(1)大循环里,然后调用delay()延时。这样写一旦遇到按键扫描,小车就“卡住”了。举个例子,如果要每秒采集一次DHT11,DHT11一次通信就需要几十毫秒的延时,这期间遥控指令到了串口,程序正在傻等延时结束,等它反应过来去读串口,数据早就被下一个字节覆盖了。
实验室巡检小车必须能同时处理三件事:接收遥控指令、轮询传感器、控制电机的运动状态。这就不能再用“顺序执行+延时”的模型,而要用“状态机+非阻塞扫描”的模型。
核心做法是:用一个定时器产生1ms或5ms的时基中断,作为系统心跳。在主循环里,依次查询各个任务是否到时间执行,而不是一直等。下面是按键消抖的状态机代码,用来处理物理按键和遥控急停按钮:
// 按键状态机 typedef enum { KEY_IDLE, // 无按键 KEY_PRESSING, // 按下确认中 KEY_PRESSED, // 按键有效 KEY_RELEASING // 松开确认中 } KeyState; KeyState key_state = KEY_IDLE; uint8_t key_debounce_cnt = 0; void key_scan_nonblock(void) { uint8_t key_now = KEY1_PIN; // 读取当前电平 switch (key_state) { case KEY_IDLE: if (key_now == PRESSED) { key_state = KEY_PRESSING; key_debounce_cnt = 0; } break; case KEY_PRESSING: if (key_now == PRESSED) { if (++key_debounce_cnt >= 5) { // 连续5次扫描都按下,才确认 key_state = KEY_PRESSED; do_key_action(); // 执行按键功能 } } else { key_state = KEY_IDLE; // 抖动,重新等待 } break; case KEY_PRESSED: if (key_now == RELEASED) { key_state = KEY_RELEASING; key_debounce_cnt = 0; } break; case KEY_RELEASING: if (key_now == RELEASED) { if (++key_debounce_cnt >= 5) { key_state = KEY_IDLE; } } else { key_state = KEY_PRESSED; } break; } }这种写法最直观的好处是:按键扫描函数只做“判断”,不做“等待”,每5ms调用一次即可。主循环里还能继续跑串口接收、传感器轮询和电机控制,互不阻塞。
任务调度用一张简单的表来组织,系统心跳为1ms:
| 任务 | 周期 |
|---|---|
| 按键/遥控状态扫描 | 5ms |
| 电机速度更新 | 20ms |
| 传感器轮询(快速) | 100ms |
| DHT11温湿度采集 | 500ms |
| MQ-2气体采集 | 500ms |
| 数据打包发送 | 1s |
3.2 遥控协议的打包、解析与执行
蓝牙串口只是传输通道,传输协议得自己定。协议设计的原则是:帧头+长度+命令+数据+校验,说白了就是给数据套一个“信封”,让接收方知道“这一帧从哪开始、到哪结束、内容是什么、有没有传错”。
我定义的协议帧格式:
| 字节序号 | 内容 | 说明 |
|---|---|---|
| 0 | 帧头1 | 固定0xAA |
| 1 | 帧头2 | 固定0x55 |
| 2 | 长度 | 从第3字节到校验字节前的总长度 |
| 3 | 命令 | 前进、后退、左转、右转、停止等 |
| 4~N | 数据 | 参数及传感器数据 |
| N+1 | 校验 | 长度+命令+数据累加和的低字节 |
比如手机发一个“前进”指令,发送的帧是:AA 55 02 01 00 03,其中01是前进命令,00是保留数据位,03是02+01+00的累加校验。接收端解析时,先判断两字节帧头,再按长度字段提取整帧,最后做累加校验,校验值对不上就丢弃整帧。
主控端串口接收采用中断方式,每收到一个字节就存入环形缓冲区,主循环再在空闲时解析,这样既不会丢数据,也不占用CPU等待时间:
#define RING_BUF_SIZE 32 volatile uint8_t ring_buf[RING_BUF_SIZE]; volatile uint8_t ring_head = 0; volatile uint8_t ring_tail = 0; void UART_ISR(void) interrupt 4 { if (RI) { RI = 0; uint8_t next = (ring_head + 1) % RING_BUF_SIZE; if (next != ring_tail) { // 缓冲区满则丢弃最旧数据 ring_buf[ring_head] = SBUF; ring_head = next; } } }解析时按状态机依次匹配帧头、长度、命令和校验,完整解析出一帧后,再根据命令字段转为对应的电机动作。这套协议的好处在于,后续你想增加摄像头云台控制、增加传感器数量,只需要扩展命令号和数据段,不需要改传输层。
3.3 PWM差速控制与速度采集
小车的转向和普通方向盘的模型不同,它是靠左右两侧轮子的速度差来实现转向的。左转时,左轮减速或停转,右轮全速或反转;右转时反过来。具体实现依赖于两路独立可调的PWM信号,STC8G内部带硬件PWM模块,可以直接映射到两个定时器输出。
初始化思路如下:配置PWM引脚为推挽输出,PWM频率设置在10kHz左右,占空比可调。这里的PWM频率很有讲究,频率太低电机会“顿挫”甚至发出嗡嗡声,频率太高又会超过驱动芯片的开关能力。10kHz是一个经过验证的稳妥值。
速度采集用的是霍尔测速法。TT马达尾部有磁环,霍尔传感器贴近磁环,每经过一个磁极就产生一个脉冲,通过外部中断计数即可。测速公式很简单:
// 假设编码盘每圈产生20个脉冲,测速窗口为100ms uint16_t pulse_cnt = 0; // 100ms内的脉冲数 uint16_t rpm = (pulse_cnt * 600) / 20; // 转/分钟 float speed_cm_s = rpm * 0.5; // 轮周长约0.5cm/转,具体按轮胎直径算如果只是做简单遥控,速度采集不是必需的。但如果想让小车在定点巡检模式下走得直、停得准,就需要闭环了。我给左右轮各加了一个增量式PID控制器,目标速度与当前速度的差作为误差,输出调节PWM占空比。增量式PID的好处是计算量小,单片机完全跑得动:
int16_t pid_control(int16_t target, int16_t current) { static int16_t err_last = 0; static int16_t integral = 0; int16_t err = target - current; integral += err; if (integral > INTEGRAL_LIMIT) integral = INTEGRAL_LIMIT; if (integral < -INTEGRAL_LIMIT) integral = -INTEGRAL_LIMIT; int16_t output = (KP * err) + (KI * integral) + (KD * (err - err_last)); err_last = err; return output; }PID参数我没法给你抄作业,因为不同底盘、不同电池电压下参数会变。我的调试方法是:先只保留P项,从小到大调,直到小车走直线时速度稳定;再加一点I项消除静态误差;最后加极小的D项抑制超调。这个过程花不了多少时间,但能让你对“闭环”的理解上一个台阶。
3.4 GPIO驱动细节:为什么LED不能直接用高电平点亮
这个知识点很基础,但特别值得讲。很多刚用51单片机的人第一次点亮LED,都是照着网上的图把LED接在IO口和GND之间,然后输出高电平,结果灯要么不亮,要么亮度暗淡。这里涉及51单片机GPIO的结构区别。
STC8G和传统51类似,P1-P5口内部是弱上拉结构,输出高电平时,实际上是靠一颗几十千欧的上拉电阻提供电流,拉载能力只有几百微安到毫安级别。LED正常点亮需要几毫安到十几毫安电流,用高电平推,电流根本不够,亮度自然上不去;如果P0口,它是开漏结构,不外部上拉的话,输出高电平时引脚相当于开路,LED压根不会亮。
正确姿势是把LED接在VCC和IO口之间,单片机输出低电平,利用IO口的“灌电流”能力来点亮LED。51单片机的IO口灌电流能力通常强于拉电流,实测低电平驱动LED亮度充足,且不会损坏IO口。限流电阻取330Ω到1kΩ之间,根据LED额定电流计算:电阻值 = (VCC - LED压降) / LED电流。
// 正确:LED接VCC与P1.0之间,低电平点亮 #define LED1_ON() P10 = 0 #define LED1_OFF() P10 = 1这个问题看似很小,但面试的时候经常会被问到,而且它背后反映的是对GPIO结构、电流路径的理解。在小车的指示灯、状态灯设计里,这个坑也得时刻注意。
4. 烧录、调试与实物联调的坑
4.1 “单片机下载失败”的排查实录
直接说结论:下载失败是嵌入式新手放弃率最高的坎,但九成以上是操作或硬件接线问题,不是芯片坏了。
- 型号选错。程序写得再好,芯片型号在下载软件里选错了,握手都完成不了。比如手头是STC8G系列,软件里却选了STC89C52,会一直卡在“正在检测目标单片机”。下载前一定要确认型号,并到官网更新到最新版STC-ISP软件,新型号芯片在老版本里不识别。
- 冷启动时序没踩对。STC的下载方式比较特殊:必须先点“下载/编程”,再给单片机断电重新上电。很多新手先让单片机通着电,再点下载,那必然失败。具体操作是先点击下载,看到“正在检测”后再重新上电。
- 波特率太高连不上。USB转串口芯片或杜邦线质量不好时,高波特率会出现误码。我遇到过CH340在115200波特率下载死活失败的问题,降低到4800后一次通过。下载成功后正常运行还是可以用高波特率,不影响。
- 引脚占用冲突。如果电路里串口接收脚被其他外设占用,比如直接接了个传感器输出,也会导致下载失败。调试时优先把下载相关引脚跳线断开。
- 供电不稳。用劣质USB线或者电池电量不足,在握手瞬间电压跌落,也会下载失败。这种情况接USB供电单独下载,成功率最高。
STM32用STM32CubeProgrammer串口下载时,逻辑类似但不完全一样:需要把BOOT0引脚拉高,然后复位一次,让芯片进入系统存储器Bootloader模式。下载完再把BOOT0拉低,重新上电才能运行用户程序。这个细节经常被忽略,导致“程序明明下载成功了,芯片就是不跑”。
4.2 电源干扰与电机冲击的实战处理
小车通电的瞬间,四个电机同时启动,电流峰值可以达到好几安培,这会导致电源电压瞬间跌落。如果主控和电机共用一个电源,单片机在电压跌落时会复位甚至死机。这个现象在充电宝供电时尤其明显,劣质充电宝在电流峰值时会触发过流保护,直接断电。
我的解决思路是分级供电:电池组(两节18650串联,约7.4V)直接给电机驱动和电机供电;同时经过LDO稳压到5V给主控和传感器供电。LDO选型注意压差和散热,普通AMS1117-5.0能应付这个场景,但如果电池电压低于6V,输出就不稳定了。这种场景可以换带低压差特性的LDO或增加DCDC降压。
除此之外,三个关键电容必须有:电池总入口一个大电解电容(470μF以上)吸收浪涌;电机驱动电源引脚再接一个100μF;主控板电源入口再加一个0.1μF陶瓷电容滤高频干扰。我实测过,加了这些电容之后,小车的死机频率从“一小时几次”降到“一整天一次也没有”。
还有一条经验:传感器和电机的地线在PCB上要分开走,最后在总地的一点汇聚,这叫单点接地。杜邦线连接时,不要把电机线和高精度传感器线绑在一起走,电机上的PWM高频干扰会串进DHT11的读数里,让数据上下乱跳。
4.3 常见问题速查表
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 小车不动作,但主控灯亮 | 电机驱动未使能或方向引脚未正确设置 | 检查驱动芯片EN脚是否拉高,方向脚逻辑是否正确 |
| 小车只有一个轮子转 | PWM通道或驱动芯片某一路损坏 | 对调两路控制信号排查是软件还是硬件问题 |
| 手机连不上蓝牙模块 | 模块未进入配对模式或波特率不匹配 | HC-05按住键上电进入AT模式,设置波特率为9600 |
| 遥控距离太短 | 蓝牙天线被金属底盘遮挡 | 天线位置抬高,远离金属件 |
| DHT11读数一直为0 | 单总线时序不满足 | 检查上拉电阻是否缺失,时序延时是否被中断打乱 |
| 电池掉电快 | 电机堵转或驱动芯片未休眠 | 检查底盘是否卡滞,程序里空闲时关PWM |
| 传感器数据刷新卡顿 | 串口传输和传感器读取时序冲突 | 把数据发送放到主循环里,不要在传感器读取的延时中阻塞 |
说到常见问题,必须提一下Proteus仿真。很多初学者问:“我能不能先不买硬件,直接仿真跑通?”当然可以,我前期就是在Proteus里把串口指令解析、状态机逻辑、PWM波形调通的。但仿真替代不了真实电机驱动、霍尔信号和电源噪声问题,所以仿真只适合验证纯逻辑代码。串口相关的仿真建议使用虚拟串口工具(如VSPD配对两个虚拟串口),配合自由串口助手收发数据,这样能模拟“手机蓝牙发指令”的全过程,非常值得一试。
5. 从项目本身延伸出去的调试心得
最后聊一聊我做这个项目的整体体会,也是给后来者的建议。
先搭最小系统再往上面加东西,这是我最想强调的一条。很多人喜欢把所有模块一起接上,功能一起写,出了问题就眉毛胡子一把抓。我的顺序是:先烧录点灯程序验证最小系统跑通;再单独调串口,发送和接收都正常后再接蓝牙模块;然后单独控制电机,确认转向和PWM正常;接着调传感器,逐个读数稳定;最后才把所有模块组装在一起联调。按这个步骤走,绝大多数问题都能精准定位到某一个模块,而不会出现“不知道是哪个部分出的毛病”。
还有一个小技巧,调试小车时建议把速度调低、把急停功能放在最显眼的位置。刚开始联调时小车速度太快会撞墙,遥控急停按钮就是保命的。可以在手机蓝牙调试助手上设置一条自定义快捷指令,一按键就发送停止帧,实测下来比去按车上的物理急停开关快得多。
这个项目后续可以扩展的方向也很多。小车底盘加一套红外循迹模块,就能实现固定路径自动巡检;再加一个太阳能追踪舵机和无线充电模块,可以做到自动回充;把传感器数据上传到局域网服务器,配合简单的网页页面,就是一个完整的物联网巡检系统;如果想进阶,把主控换成ESP32甚至嵌入式Linux平台,接入摄像头做视觉识别,那又是一层质变。
但无论怎么扩展,底层的东西不会变:状态机的调度思想、协议帧的设计方法、PWM和ADC的应用、GPIO驱动的细节,这些都是嵌入式开发的地基。把这一套做扎实,后面写任何项目都会顺利很多。