51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

人体工学椅的电机控制需要与上位机(如PC或手机APP)进行通信,请设计一个通信协议(如基于UART的简单协议),包括数据帧格式(头部、长度、数据、校验)、错误检测机制(如CRC),并说明如何处理通信中断或数据丢失。

乐歌股份嵌入式软件工程师(管培生/校招生)难度:中等

答案

1) 【一句话结论】
采用基于UART的通信协议,数据帧包含帧头、数据长度、数据内容、CRC16校验码,通过CRC校验检测错误并设计重传机制,确保电机控制指令与上位机可靠通信。

2) 【原理/概念讲解】

  • UART通信:串行通信协议,通过TX/RX引脚传输数据,波特率(如9600)决定传输速率,适合短距离、低速率设备通信。
  • 数据帧结构:
    • 帧头(1字节):标识帧类型,如0xAA(起始帧,表示数据有效)。
    • 长度字段(1字节):表示后续数据域的字节数(如电机控制命令为2字节,则长度为0x02),防止数据截断。
    • 数据域(N字节):具体控制指令(如电机启动/停止,假设为2字节,如0x01表示启动,0x02表示停止)。
    • CRC校验(2字节):对帧头、长度、数据域进行多项式计算,生成校验码(如CRC16),接收端重新计算比对,若不一致则请求重传。
  • 错误检测与恢复:
    • CRC16通过多项式(如0x1021)计算校验码,能检测突发错误(如连续比特错误)。
    • 通信中断处理:发送端设置“发送完成”标志,接收端用队列存储数据;若中断导致数据丢失,通过ARQ(自动请求重传)协议,接收端发送ACK确认,未确认则重传。

3) 【对比与适用场景】

校验方式定义特性使用场景注意点
奇偶校验每字节添加1位校验位,使1的个数为奇/偶简单,仅能检测奇数个错误低速、短距离(如传感器)无法检测偶数错误,可靠性低
校验和对数据域求和取低8位简单,易受数据分布影响低速、短距离可能漏检偶数错误
CRC16对数据域进行多项式除法,生成16位校验码检测能力强(可检测突发错误)高速、长距离(如电机控制)计算复杂,需预定义多项式

4) 【示例】

  • 数据帧结构(十六进制):0xAA 0x02 0x01 0x02 0x1A 0x27
    • 解析:帧头0xAA(起始)、长度0x02(数据2字节)、数据0x01(启动)、0x02(停止)、CRC160x1A27(校验码)。
  • 伪代码(发送端):
    void send_motor_cmd(uint8_t start, uint8_t stop) {
        uint8_t frame[6];
        frame[0] = 0xAA;          // 帧头
        frame[1] = 2;             // 数据长度
        frame[2] = start;         // 数据1(启动)
        frame[3] = stop;          // 数据2(停止)
        uint16_t crc = calculate_crc16(frame, 4); // 计算CRC
        frame[4] = (crc >> 8) & 0xFF; // 高位
        frame[5] = crc & 0xFF;       // 低位
        uart_send(frame, 6);         // 发送6字节
    }
    
  • 伪代码(接收端):
    void recv_motor_cmd() {
        uint8_t rx[6];
        if (uart_receive(rx, 6) == 6) { // 接收6字节
            if (rx[0] != 0xAA) return; // 帧头错误
            uint16_t calc_crc = calculate_crc16(rx, 4); // 计算CRC
            if (calc_crc != (rx[4] << 8) | rx[5]) {
                send_ack(0); // 发送NACK,请求重传
                return;
            }
            handle_motor(rx[2], rx[3]); // 执行控制
        }
    }
    

5) 【面试口播版答案】
“面试官您好,针对人体工学椅电机控制与上位机的通信,我设计了一个基于UART的通信协议。数据帧包含帧头(0xAA标识起始)、长度字段(1字节,表示数据字节数)、数据域(电机控制命令,如启动/停止)、CRC16校验(2字节,用于错误检测)。错误检测通过CRC16多项式计算校验码,接收端验证后处理数据;若中断导致数据丢失,采用ARQ协议重传。例如,发送启动命令时,帧为0xAA 0x02 0x01 0x00 0x1A 0x27,其中0x1A27是CRC校验码,接收端确认后执行电机启动。”

6) 【追问清单】

  • 问:CRC16的具体多项式是什么?
    答:通常使用0x1021(X^16+X^12+X^5+1),这是常用的CRC16-CCITT多项式。
  • 问:如何处理通信中断导致的数据丢失?
    答:采用ARQ(自动请求重传)协议,接收端发送ACK确认,超时未收到则重传,发送端设置重传计时器。
  • 问:多设备通信时如何避免冲突?
    答:增加设备地址字段(1字节),帧头后添加设备地址,上位机指定目标设备,避免广播冲突。
  • 问:协议是否考虑数据加密?
    答:当前设计未加密,若需安全通信可添加AES-128加密,但会增加计算开销,适用于敏感数据传输。

7) 【常见坑/雷区】

  • 帧头固定导致冲突:若多个设备同时发送帧头为0xAA的帧,可能冲突,需增加设备地址区分。
  • 长度字段错误导致数据截断:若长度字段错误,接收端读取数据时可能遗漏或多读,需严格校验长度。
  • CRC计算错误:若CRC生成或验证逻辑错误,会导致误判,需用已知数据测试验证。
  • 中断处理不当:若中断时未保存数据状态,可能导致数据丢失,需用标志位或队列管理。
  • 协议过于复杂:若包含过多字段(如时间戳、序列号),会增加计算开销,影响实时性,需平衡复杂度和性能。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1