原标题:1500块的STM32毕设,居然从里到外全是假的!
问题
深夜收到朋友消息,语气很崩:"哥,求救"。
这段时间帮一个朋友她的本科毕业设计,题目是基于STM32的室内防火防盗装置,大抵是通过某渠道做好了全部的装置,总共收费了1500。
本来事情到这也就算了,交差了嘛。但她想在原来的基础上加一个远程布防的功能,去问原作者能不能改——对方说,不行,得把装置寄回去重新烧固件加一个功能要寄回去重新烧固件。
我当时听到这句就觉得不太对劲。一个远程布防,说白了就是加个指令逻辑,是毕设里再正常不过的需求,虽说涉及到硬件APP改动,但是和烧录固件有什么关系?
然后我就查看了一下原理图,这个原理图说实话非常的奇怪,感觉很多地方的连线都有点奇怪,而且WIFI模块是ESP8266的样子,但是RXD居然没接线,只连了TXD。说实话,这张原理图看得我眉头越皱越紧。从电源到信号线,很多地方的连线逻辑都很奇怪,最明显的一处——WiFi模块标的是 ESP8266,但 RXD引脚居然是悬空的,只接了一根TXD。
你哪怕刚学两天单片机都知道,串口通信要么只发不收,要么收发都得接。RXD 悬空意味着WIFI根本收不到MCU的数据,那就只能往收到指令,没法收回应。这不叫原理图设计,这叫连连看。
那基本可以确认了——原理图是后面补画的,先做了个能通电演示的东西,然后照着实物大概画了张图出来交差。画图的人可能连自己画的每条线是干什么的都没想清楚,所以才会把 ESP8266的RXD漏掉这种低级错误。
于是我就去翻他给的代码。
一打开工程,先愣住了——里面赫然躺着一份步进电机的驱动代码。步进电机。防火防盗装置哪来的步进电机???我又倒回去看了一眼题目,室内防火防盗,烟雾传感器、人体红外、蜂鸣器报警,从头到尾跟步进电机没有任何关系。我当时脑子里只有一个念头:这代码到底是给谁写的,是不是一个工程模板改吧改吧就发过来了。
硬着头皮接着往下翻。OLED 的驱动,DHT11 的温湿度读取——等等,DHT11?我明明记得原理图上画的是 DS18B20。又翻出原理图确认了一遍,是 DS18B20 没错。传感器型号都对不上,原理图和代码根本就不是同一套东西,各画各的,各写各的。
到这里我已经有心理准备了,但最绝的还在后面。
代码有编译报错。
不是 warning,是直接编译不过去的error。你全包收 1500 块,交付的代码连编译都过不了,这已经不是技术好不好的问题了,是压根没想过要交一份能用的东西。变量未定义、函数名写错,一编译IDE下面一片红。
看到这里我真的有点来气。朋友不懂技术,花1500块买个安心,结果买回来的是:洞洞板焊的实物、画错的原理图、抄错传感器型号的代码、以及一个IDE都过不了的工程。要不是她想加个远程布防功能找到我,可能到现在都不知道自己拿到的是一堆什么玩意。
你以为这就结束了?
然后我转念一想,行吧,代码烂归烂,假如 WiFi 模块本身是能跑的呢?那就让她在 APP 端加一个布防按钮,往 MCU 发一条指令,我在固件里接这个指令加一道状态锁,也不是不行。于是我让她去问原作者要云服务器的地址,我说大不了我重新给你做一个 APP。
结果她发来一张截图,上面赫然写着——192.168.1.1。
我看了一眼,直接笑了。192.168.1.1,这是局域网地址。也就是说这套东西根本不是走的什么云服务器,大概率是手机连上ESP8266开的WiFi热点,然后走TCP局域网通信。手机发指令给ESP8266,ESP8266通过串口丢给MCU,从头到尾都在一个房间里打转。所谓的"远程",其实就是你站那块板子旁边。
行吧,也算是通信。
然后我脑子里冒出一个更骚的思路——既然MCU 是通过串口往ESP8266 发包的,那TXD和RXD两根线上跑的数据,其实全是我能控制的。我干脆把这两根线并出来,飞到我自己的4G模块上,MCU发什么,4G 模块照样收一份,然后把数据捅到我自己的服务器上去。
换句话说,她原有的那套ESP8266局域网通信逻辑我完全不动,我就在串口线上"偷听"一份数据,走4G 上云。APP我也自己重新做。这样原有功能原封不动保留,远程布防和其他扩展功能我自己加,不用再求那个原作者改一行业不肯改的固件。
想通这一层的时候,说实话还有点兴奋。烂摊子归烂摊子,至少这条路,走得通。
然后拿到她的实物的时候,我完全傻眼了。
实物
那个东西比我想象的大了好几圈,根本不是 ESP8266 那个指甲盖大小的模块。我盯着它看了好几秒——这TMD到底是啥???ESP8266 长这样???
更让我崩溃的在后面。
我翻到背面去看单片机跟这个"WiFi 模块"之间的连线,串口的 TXD 和 RXD——压根没焊。两个引脚光溜溜地杵在那,一根线都没接。
没接线。
我当时反复看了不下三遍,每看一遍都觉得自己是不是眼花了。然后又去问她,这东西真的能用吗,演示的时候真的正常吗,APP 上那个数据是实时变的吗。问到最后我甚至开始怀疑,APP 上显示的温度、烟雾浓度那些数字,是不是根本就是随机的,或者写死在 APP 里的,跟这块板子半毛钱关系没有。
串口线没接,MCU 和 WiFi 模块之间就没有数据通道。那手机 APP 收到的数据是从哪来的?这个问题我想了很久,最后的结论只有一个——演示的时候,APP 显示的那些东西,跟这块板子,可能是两个宇宙里各自独立运行的东西。
俺寻思之力也不过如此了。
但我还是多看了几眼,越看越不对劲。
然后我顺着 PCB 走线一路捋过去——温湿度传感器,接到这个芯片上。烟雾传感器,接到这个芯片上。蜂鸣器,也接到这个芯片上。所有外设,全部挂在这颗"ESP8266"上。
我回头去找 STM32 的引脚,想看它到底管了什么。一颗 STM32F103C8T6,40个脚好好地焊在板子上,3.3V供着电,晶振也在振,但它跟这些传感器之间——没有一根数据线。它唯一干的活,可能就是亮着灯告诉你"我通电了"。
所以这块板子的真面目是:STM32是摆设,所有传感器数据采集、逻辑判断、报警输出,全跑在这一颗芯片上。
所以回到题目——「基于STM32的室内防火防盗装置」。STM32就焊在上面,你也不能说没有。但你问它干了什么,它什么也没干。全套功能都在 ESP8266上跑,STM32站在那里,像个群演。
1500块,买了一块ESP32开发板,上面焊了一颗负责发呆的STM32。
怪不得说要重新烧录固件。
我当时脑子里那根线突然就通了。她说加一个远程布防功能,对方说要把装置寄回去——为啥?因为 STM32的代码改了也没用啊,所有逻辑全在 ESP8266 上跑着。你改了STM32端的固件,烧进去,板子该干嘛还干嘛,因为STM32根本就没参与控制。人家那边要改的是ESP8266的代码,但ESP8266的固件人家是不可能给她的,一给她就全露馅了。
所以不是"寄回去重新烧固件很麻烦",而是"你不能自己烧,一烧就发现STM32里面根本没东西"。
所以原理图是瞎画的,RXD 不接线也无所谓,因为根本就不需要STM32跟ESP8266通信——俩芯片之间压根没有数据要传。传感器数据走ESP8266自己的 GPIO,逻辑判断在 ESP8266上做,报警信 ESP8266自己输出,APP 直连ESP8266 WiFi。STM32在整个系统里唯一的贡献,就是让老师路过的时候能看见板子上有一颗 ARM 芯片。
写到这我是真的不知道说什么好。你说他骗人吧,人家确实给了你一块能演示的板子。你说他没骗吧,题目是 STM32,东西跑在 ESP8266上,给你一个烧不进代码的 STM32 当吉祥物,这算不算欺诈?
修复
后来知道了原因,我就把装置飞线改了,所有的传感器从ESP8266上拆下来,飞到单片机的引脚上,然后重写单片机的代码,重写APP。
而且还有让我震惊的是,我第一次在STLink上看到了显示这是一颗假芯片的提示:
我用了这么多年 STM32,第一次看到 ST-Link 直接告诉你,这颗芯片是假的。不是"连接失败",不是"未知设备",是明明白白地告诉你,你手里这玩意儿,不是 ST 原厂的。
当时那个心情真的很复杂。原理图是假的,代码是假的,功能是假的,现在连芯片本身都是假的。1500 块从里到外,没有一样东西是真的。
好在最后通过飞线、重写代码、重做APP还是完成了所有的功能。
276