面灵AI→

思格新能源一面(通用嵌入式软件开发)

轮次
一面
时间
2026-09
来源
牛客网

《面试题目》

  1. 用过 RS485、CAN、以太网吗?
  2. 详细介绍一下项目。
  3. 电赛几个人组队,你主要负责什么?
  4. 手撕:密码校验。

《参考解析》

1. RS485 的电气特性与链路层定位:RS485 只规定电气层,不规定协议,差分走 A/B 两条线,靠共模抑制获得强抗干扰能力,理论速率 10Mbps(12m 内)或 100kbps 跑到 1200m。总线是手拉手拓扑,两端各接 120Ω 终端电阻消除反射,标准负载不超过 32 个节点(用 1/8 负载收发器可到 256 个)。工程上必须共地或用隔离收发器(ADM2483 一类),户外场景还要加 TVS 和共模电感防浪涌。回答时不要停在参数上,补一句实做经验更有说服力:跑的什么波特率、线长多少、挂了多少个从站、Modbus RTU 还是自定义帧、隔离和防雷怎么做的。

2. RS485 收发切换与 Modbus RTU 实现:半双工最大的坑是 DE/RE 使能脚的时序——发送前拉高,必须等最后一个字节真正移位完成(TC 标志或 UART 传输完成中断)才能拉低,否则尾字节会被截断,这是现场最常见的「偶发丢帧」根因。接收端按 3.5 个字符时间的静默间隔判帧结束,再校验 CRC16,配合超时重传、从站地址过滤和异常码处理。软件结构上推荐 DMA 收发 + IDLE 中断判帧 + 环形缓冲区,中断里只搬数据,解析交给任务;跑 RTOS 时用消息队列把整帧交给协议任务,避免在中断里做耗时逻辑。

3. CAN 的仲裁机制与报文格式:CAN 是差分总线(CAN_H/CAN_L),显性位覆盖隐性位,多主结构下用非破坏性逐位仲裁解决冲突:ID 越小优先级越高,发隐性位而总线上是显性的节点自动退出发送、转为接收,报文不会丢,实时性因此有保证。标准帧 11 位 ID、扩展帧 29 位,数据场 0~8 字节(CAN FD 到 64 字节且速率可变),带位填充、CRC15、ACK 槽和错误帧。必答点是错误管理:TEC/REC 计数把节点在错误主动、错误被动、Bus-Off 三个状态间迁移,Bus-Off 后要检测 128 次连续 11 位隐性位才能恢复。硬件上两端 120Ω、支线尽量短、采样点取 75%~87.5%。

4. CAN 的实战细节与排查:STM32 这类 MCU 用 bxCAN 的过滤器组把关心的 ID 路由到 FIFO0/1,避免 CPU 被无关报文打断;发送邮箱只有三个,要明确邮箱满时是阻塞等待还是丢弃,否则高负载下会出现「偶尔发不出去」。常见坑有几个:多个节点用同一 ID 周期发送会让仲裁失效、总线负载升高,一般要把负载压在 30%~50% 以下;中断里做的事太多会导致接收溢出(OVR 置位);抓不到帧时先查波特率与采样点、终端电阻、CAN_H/CAN_L 是否接反这三件事。如果上层跑 CANopen 或 J1939,还要能说清 PDO/SDO 或报文优先级的划分思路。

5. MCU 上的以太网与协议栈:典型方案是 MCU 内置 MAC 加外置 PHY(LAN8720、DP83848),接口用 RMII(需 50MHz 参考时钟)或 MII,通过 MDIO/MDC 读写 PHY 寄存器完成自协商和链路状态检测。软件侧通常跑 lwIP:裸机用 raw API、配合 RTOS 用 netconn/socket API,需要配置静态 IP 或 DHCP/DNS,并盯住内存池大小、pbuf 零拷贝、TCP 发送窗口和最大连接数这些容易踩的参数。调试手段很实在:先 ping 通不通,再看 ARP 表和 PHY 寄存器状态,最后用 Wireshark 抓包定位重传与握手失败。工业场景常要和 Modbus TCP、EtherCAT、PROFINET 共存,实时性靠 RT 类别和交换机规划,不是单纯把线插上就行。

6. RS485、CAN、以太网怎么选:三者的层次和定位并不重合。RS485 只是电气层,便宜、简单、抗干扰好,适合一主多从的轮询式采集(电表、传感器、光伏逆变器),缺点是带宽低、没有硬件仲裁、多主时靠软件避让。CAN 有控制器级的仲裁与错误管理,适合强实时、多节点、短报文的场景(汽车、储能 BMS、逆变器并联),代价是速率 1Mbps 以内、单帧只有 8 字节,传大数据要上层分包。以太网带宽高、可跨网互联、能直接对接云平台与远程运维,但协议栈重、成本高,非 TSN 场景下确定性不如总线。结合光储业务,常见组合是 CAN 连 BMS 与 PCS、RS485 抄表和接电表、以太网接 EMS 与云平台。

7. 项目讲述:从一句话到三层追问:先一句话讲清「做了什么、给谁用、解决了什么问题」,再按背景—目标—方案—难点—结果展开,把时间留给自己真正动手的模块,最好配一张拓扑图和数据流说明。关键指标要能报出数字:采样周期、通信速率、响应时间、丢包率、连续运行时长。随后主动预判三层追问:为什么选这个芯片、总线或协议(对比替代方案与代价);最难的问题是什么、怎么定位(示波器、逻辑分析仪、抓包、日志)和最终根因;如果重做会改什么。用「问题—定位—解决—验证」的闭环讲,比罗列技术栈有效得多。电赛的分工问题同理,说清队伍人数、你负责的模块、代码量和最硬的技术点即可,不要泛泛说「负责软件部分」。

8. 手撕密码校验:规则实现与安全存储:常见题面是给定字符串校验密码强度:长度 8~20,必须包含大写字母、小写字母、数字、特殊字符中的至少三类,不允许空格和中文。实现要点是一次遍历分别打标记,避免为每种字符类型各扫一遍;先判 NULL 和长度再访问字符,防止越界;调用 ctype 系列函数前把字符转成 unsigned char,否则遇到高位字节是未定义行为。写的时候先讲思路、加注释,自己补几个用例(全数字、全小写、正好 8 位、20 位、空串)。进阶追问通常落在存储上:密码绝不能明文或只用裸 MD5 保存,要加盐后用 bcrypt/scrypt/Argon2 这类慢哈希;比较用恒定时间比较防时序侧信道;错误提示要模糊,不区分「用户不存在」和「密码错误」;再加错误次数限流与锁定。