"# Arduino 座舱通讯协议:实现串口通讯数据结构和示例程序\n\n## 串口通讯数据结构\n\n### 正常数据\n\n| 开始标记位 | 功能码 | 设备ID | 长度 | 功能1 | 功能2 | 功能3 | 功能4 | ……… |\n|---|---|---|---|---|---|---|---|---|\n| 1Byte | 1Byte | 1Byte | 1Byte | N Byte | N Byte | N Byte | N Byte | \n| AE | 01 | 问询/返回 | 02控制 | 自定义不可重复 | 功能数据总长度 | | | \n\n### 故障数据\n\n| 开始标记位 | 功能码 | 设备ID | 长度 | 故障码 |\n|---|---|---|---|---|\n| 1Byte | 1Byte | 1Byte | 1Byte | 2 Byte |\n| AE | 03故障数据 | 自定义不可重复 | 默认值 2 | 具体故障代码,详细代码含义查询故障码文档\n\n\n## 例:\n\n### 设备信息描述\n\n| 设备 | 设备ID | 功能ID | 功能描述 | 功能类型 (Read、\nWrite、\nRead&Write) | 数据长度(Byte) | 数据类型 | 周期(ms)\n(0问询) | 比例因子 | 实际值范围 | 备注 |\n|---|---|---|---|---|---|---|---|---|---|---|\n| Seat | | | | | | | | | | |\n| | 01 | 01 | 座椅1前后\n0 停止\n1 前\n2 后 | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-2 | |\n| | | 02 | 座椅1 上下\n0 停止\n1 上\n2 下 | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-2 | |\n| | | 03 | 座椅1 俯仰\n0 停止\n1 俯\n2 仰 | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-2 | |\n| | 02 | 04 | 座椅2前后\n0 停止\n1 前\n2 后 | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-2 | |\n| | | 05 | 座椅2 上下\n0 停止\n1 上\n2 下 | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-2 | 座椅2为副驾座,上下功能预留 |\n| | | 06 | 座椅2 俯仰\n0 停止\n1 俯\n2 仰 | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-2 | |\n| | 03 | 07 | 座椅3前后\n0 停止\n1 前\n2 后 | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-2 | |\n| | | 08 | 座椅3 上下\n0 停止\n1 上\n2 下 | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-2 | 座椅3为主后座,上下功能预留 |\n| | | 09 | 座椅3 俯仰\n0 停止\n1 俯\n2 仰 | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-2 | |\n| | 04 | 10 | 座椅4前后\n0 停止\n1 前\n2 后 | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-2 | |\n| | | 11 | 座椅4 上下\n0 停止\n1 上\n2 下 | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-2 | 座椅4为副后座,上下功能预留 |\n| | | 12 | 座椅4俯仰\n0 停止\n1 俯\n2 仰 | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-2 | |\n| | | 13 | 座椅1坐垫震动\n0关闭\n1档位A\n2档位B\n3档位C | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-3 | 座椅电机分为ABC三个档位 |\n| | | 14 | 座椅1靠背震动\n0关闭\n1档位A\n2档位B\n3档位C | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-3 | |\n| | | 15 | 座椅2坐垫震动\n0关闭\n1档位A\n2档位B\n3档位C | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-3 | 座椅电机分为ABC三个档位 |\n| | | 16 | 座椅2靠背震动\n0关闭\n1档位A\n2档位B\n3档位C | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-3 | |\n| | | 17 | 座椅3坐垫震动\n0关闭\n1档位A\n2档位B\n3档位C | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-3 | 座椅电机分为ABC三个档位 |\n| | | 18 | 座椅3靠背震动\n0关闭\n1档位A\n2档位B\n3档位C | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-3 | |\n| | | 19 | 座椅3坐垫震动\n0关闭\n1档位A\n2档位B\n3档位C | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-3 | |\n| | | 20 | 座椅3靠背震动\n0关闭\n1档位A\n2档位B\n3档位C | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-3 | |\n| | | 21 | 座椅4坐垫震动\n0关闭\n1档位A\n2档位B\n3档位C | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-3 | |\n| | | 22 | 座椅4靠背震动\n0关闭\n1档位A\n2档位B\n3档位C | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-3 | |\n| wheel | | 23 | 方向盘震动\n0关闭\n1开启 | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-3 | 方向盘只有1个档位 |\n| window | | 24 | 主驾玻璃上下\n0 停止\n1 上\n2 下 | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-2 | 玻璃升降 |\n| | | 25 | 副驾玻璃上下\n0 停止\n1 上\n2 下 | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-2 | 玻璃升降 |\n| | | 26 | 主后玻璃上下\n0 停止\n1 上\n2 下 | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-2 | 玻璃升降 |\n| | | 27 | 副后玻璃上下\n0 停止\n1 上\n2 下 | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-2 | 玻璃升降 |\n| LED | | 28 | 阅读灯舵机移动\n0 停止\n1 45° | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-1 | 默认电机90°,打开阅读灯为偏转45° |\n| | | 29 | 阅读灯\n0 关闭\n1 开启 | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-1 | 备选方案,下位机根据舵机移动角度开启。 |\n| | | 30 | 氛围灯\n0 关闭\n1 红色\n2 绿色 3 蓝色 4 黄色 5 紫色 6 青色 7 白色 8 慢循环 9 快循环 | Read&Write | 1 | 无符号整形(范围0-255) | 0 | 1 | 0-9 | 暂定9中模式,后续再定。 |\n| Pedal | 02 | 07 | 油门\n0-10\n0为最小值\n10为最大值 | Read | 2 | 16位无符号整形 | 20 | 0.01 | 0-10 | 实际物理值=串口值比例因子;\n周期为主动上传每两帧之间间隔时间,单位ms ; |\n| | | 08 | 刹车\n0-10\n0为最小值\n10为最大值 | Read | 2 | 16位无符号整形 | 20 | 0.01 | 0-10 | |\n\n## 控制\n\n上位机发送:AE 02 01 06 00 01 00 00 01 00\n控制座椅1 和座椅2 同时向上移动\n\n## 问询\n\n上位机发送:AE 01 01\n上位机问询 当前座椅设备状态\n下位机返回:AE 01 01 06 00 01 00 00 01 00\n下位机返回当前设备状态 座椅1 和座椅 2 处于上升状态,其它状态为停止状态 \n\n## 主动上传\n\n下位机发送:\nAE 01 02 04 02 DD 00 00\n油门值为7.33(7330.01),刹车值为 0(00.01);\n\n## 故障信息\n\n下位机发送:\nAE 03 01 02 00 0f\n座椅 1设备故障\n\n## 上位机配表结构\n\n主体软件中设备定义和该结构中设备定义不一致,该文档中设备 为最小模块化设备,\n主体软件中设备定义为 同一接口或互相关联的所有接口设备的集合\n\n主体软件中设备通过不同设备的文件名称来区分设备配表,配表具体命名格式为\n"主体软件定义设备名称+Config",文件可按照json格式存储,对配置文件进行加密处理。\n\n## 总表结构\n\n| 设备1 | |\n|---|---|\n| 设备2 | |\n| 设备3 | |\n| 设备4 | |\n| 设备……. | |\n\n## 设备属性\n\n| 设备属性 | 描述 |\n|---|---|\n| 串口ID | 所属哪个串口 |\n| 设备ID | 设备ID,唯一 |\n| 数据类型 | 应答\n需要发送问询帧获取数据 \n通知\n按照固定频率上传数据 |\n| 功能1 | 功能1 相关属性(详细结构参考功能属性) |\n| 功能2 | 功能2 相关属性 |\n| 功能3 | 功能3 相关属性 |\n| 功能4 | 功能4 相关属性 |\n| …… | ….. |\n\n## 功能属性\n\n| 功能类型 | 描述 |\n|---|---|\n| 只读 | 写入数据无效,只可获取状态值 |\n| 只写 | 只可控制,无状态读取 |\n| 读写 | 可进行控制,可获取状态值 |\n| 数据长度 | 字节长度 |\n| 起始位 | 数据起始位(以长度字节后第一个字节为索引0 计算,实际计算中+4) |\n| 比例因子 | 串口值比例因子 等于实际物理值 |\n| 数据类型 | |\n\n数据类型包括(\n有符号整形、\n无符号整形、\n浮点型\n\n## 客户端 发送数据格式\n\n| 属性 | 描述 |\n|---|---|\n| 功能码 | 详情参照功能码解释 |\n| 设备ID | 设备具体ID |\n| 功能ID | 功能ID |\n| 数据 | 按照文档要求输入数据 |\n\n## 功能码\n\n| Command | 控制指令 |\n| Read | 读取状态指令(客户端读取和主体软件返回均用该标识) |\n| Error | 错误状态(主体软件返回用该状态) |\n\n## 主体软件 返回\n\n| 属性 | 描述 |\n|---|---|\n| 功能码 | 详情参照功能码解释 |\n| 设备ID | 设备具体ID |\n| 功能ID | 功能ID |\n| 数据 | 按照文档要求输入数据 |\n\n## 功能码\n\n| Command | 控制指令 |\n| Read | 读取状态指令(客户端读取和主体软件返回均用该标识) |\n| Error | 错误状态(主体软件返回用该状态) |\n\n## 内容:以下是一个满足上述协议的Arduino程序示例:\n\nc++\n#include <SoftwareSerial.h>\n\n// 定义串口通讯参数\n#define BAUD_RATE 9600\n#define RX_PIN 10\n#define TX_PIN 11\n\n// 定义功能码\n#define COMMAND 0x02\n#define READ 0x01\n#define ERROR 0x03\n\n// 定义设备ID和功能ID\n#define DEVICE_ID 0x01\n#define FUNCTION_ID 0x01\n\n// 定义功能数据\n#define DATA_LENGTH 1\n#define FUNCTION_DATA 0x01\n\n// 定义开始标记位\n#define START_FLAG 0xAE\n\nSoftwareSerial serial(RX_PIN, TX_PIN); // 创建一个软件串口\n\nvoid setup() {\n Serial.begin(BAUD_RATE);\n serial.begin(BAUD_RATE);\n}\n\nvoid loop() {\n // 读取串口数据\n if (serial.available()) {\n byte data = serial.read();\n\n // 解析数据\n if (data == START_FLAG) {\n byte functionCode = serial.read();\n\n // 判断功能码\n if (functionCode == COMMAND) {\n byte deviceID = serial.read();\n byte length = serial.read();\n\n // 判断设备ID\n if (deviceID == DEVICE_ID) {\n // 执行控制指令\n byte functionData = serial.read();\n // TODO: 执行相应的控制操作\n }\n } else if (functionCode == READ) {\n byte deviceID = serial.read();\n\n // 判断设备ID\n if (deviceID == DEVICE_ID) {\n // 发送当前设备状态\n sendDeviceStatus();\n }\n }\n } else if (data == START_FLAG) {\n byte functionCode = serial.read();\n\n // 判断功能码\n if (functionCode == ERROR) {\n byte deviceID = serial.read();\n byte length = serial.read();\n\n // 判断设备ID\n if (deviceID == DEVICE_ID) {\n // 处理故障信息\n byte errorCode = serial.read();\n // TODO: 处理相应的故障信息\n }\n }\n }\n }\n}\n\n// 发送当前设备状态\nvoid sendDeviceStatus() {\n byte startFlag = START_FLAG;\n byte functionCode = READ;\n byte deviceID = DEVICE_ID;\n byte length = DATA_LENGTH;\n\n // 模拟当前设备状态\n byte functionData = FUNCTION_DATA;\n\n // 发送数据\n serial.write(startFlag);\n serial.write(functionCode);\n serial.write(deviceID);\n serial.write(length);\n serial.write(functionData);\n}\n\n// 发送故障信息\nvoid sendError(byte errorCode) {\n byte startFlag = START_FLAG;\n byte functionCode = ERROR;\n byte deviceID = DEVICE_ID;\n byte length = 2;\n\n // 发送数据\n serial.write(startFlag);\n serial.write(functionCode);\n serial.write(deviceID);\n serial.write(length);\n serial.write(errorCode);\n}\n\n\n请注意,上述示例只是一个简单的示例,具体的实现取决于你的具体需求和硬件设备。你需要根据实际情况修改和完善代码。\n


原文地址: https://www.cveoy.top/t/topic/pqVa 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录