如何维护企业电子商务网站建设,国家对网站建设补补贴,路桥贝斯特做网站好吗,虾皮跨境电商注册版本历史版本号修订说明修订人修订日期1.0初始版本--2.0增加通道选择、完善增益配置、修正传感器类型-2024-12
一、串口信息参数值物理接口USB#xff08;CH340转串口#xff09;波特率115200数据位8停止位2校验无
二、报文帧格式
2.1 标准帧结构#xff08;8字节#xff0…版本历史版本号修订说明修订人修订日期1.0初始版本--2.0增加通道选择、完善增益配置、修正传感器类型-2024-12一、串口信息参数值物理接口USBCH340转串口波特率115200数据位8停止位2校验无二、报文帧格式2.1 标准帧结构8字节字节位置字段名说明Byte 0帧头固定 0xAAByte 1命令码操作类型Byte 2数据1主数据字段Byte 3数据2配置字段Byte 4数据3扩展配置1Byte 5数据4扩展配置2Byte 6校验和累加校验Byte 7帧尾固定 0x552.2 校验算法校验和(命令码数据1数据2数据3数据4)0xFF三、命令码定义命令码名称方向说明0x01读取电量PC→STM32请求读取电池电量0x81电量响应STM32→PC返回电池电量0x02设置配置PC→STM32设置传感器、模式和增益0x82设置响应STM32→PC确认设置结果0x03读取配置PC→STM32查询当前配置0x83配置响应STM32→PC返回当前配置0xF0心跳包双向保持连接活跃规则响应码 请求码 | 0x80四、数据字段详细定义4.1 命令 0x01/0x81 - 电量查询请求帧0x01字段值说明数据10x00无效数据20x00无效数据30x00无效数据40x00无效响应帧0x81字段范围说明数据10x00~0x64电量百分比0~100数据20x00/0x01充电状态0放电1充电数据30x00保留数据40x00保留4.2 命令 0x02/0x82 - 配置设置请求帧0x02数据1传感器、通道和模式配置位域定义 ┌────┬────┬────┬────┬────┬────┬────┬────┐ │ D7 │ D6 │ D5 │ D4 │ D3 │ D2 │ D1 │ D0 │ ├────┴────┴────┴────┼────┼────┴────┴────┤ │ 传感器类型 │通道│ 工作模式 │ └──────────────────┴────┴───────────────┘ Bit[7:5] - 传感器类型 000 保留 001 差分传感器 (DIF) 010 IEPE传感器 011~111 保留 Bit[4] - 通道选择 0 A通道 1 B通道 Bit[3:0] - 工作模式 0000 保留 0001 动平衡模式 (BAL) 0010 振动模式 (VIB) 0011~1111 保留传感器和模式组合映射表数据1值传感器通道模式硬件GPIO0x21IEPEA动平衡IEPE_BAL_A10x22IEPEA振动IEPE_VIB_A10x31IEPEB动平衡IEPE_BAL_B10x32IEPEB振动IEPE_VIB_B10x11差分A动平衡DIF_BAL_A10x12差分A振动DIF_VIB_A10x19差分B动平衡DIF_BAL_B10x1A差分B振动DIF_VIB_B1数据2振动模式增益配置位域定义 ┌────┬────┬────┬────┬────┬────┬────┬────┐ │ D7 │ D6 │ D5 │ D4 │ D3 │ D2 │ D1 │ D0 │ ├────┴────┴────┴────┴────┴────┼────┴────┤ │ 保留填0 │ 增益 │ └─────────────────────────────┴─────────┘ Bit[1:0] - VIB增益选择 00 0.5倍 (VIB_A00, VIB_A10) 01 1倍 (VIB_A01, VIB_A10) 10 5倍 (VIB_A00, VIB_A11) 11 10倍 (VIB_A01, VIB_A11) 注意仅在工作模式振动时有效动平衡模式下该字段无效数据3动平衡前级增益配置位域定义 ┌────┬────┬────┬────┬────┬────┬────┬────┐ │ D7 │ D6 │ D5 │ D4 │ D3 │ D2 │ D1 │ D0 │ ├────┴────┴────┴────┴────┴────┼────┴────┤ │ 保留填0 │前级增益 │ └─────────────────────────────┴─────────┘ Bit[1:0] - 积分电路前级增益 00 2.5倍 (INT_AMP_A00, INT_AMP_A10) 01 5倍 (INT_AMP_A01, INT_AMP_A10) 10 10倍 (INT_AMP_A00, INT_AMP_A11) 11 20倍 (INT_AMP_A01, INT_AMP_A11) 注意仅在工作模式动平衡时有效振动模式下该字段无效数据4动平衡频率和后级增益配置位域定义 ┌────┬────┬────┬────┬────┬────┬────┬────┐ │ D7 │ D6 │ D5 │ D4 │ D3 │ D2 │ D1 │ D0 │ ├────┼────┴────┴────┴────┴────┼────┴────┤ │频率│ 保留填0 │后级增益 │ └────┴─────────────────────────┴─────────┘ Bit[7] - 积分频率范围选择 0 5~200Hz (INT_FREQ_SEL0) 1 0.5~10Hz (INT_FREQ_SEL1) Bit[1:0] - 后级放大增益 00 1倍 (END_A0, END_B0) 01 2.5倍 (END_A1, END_B0) 10 5倍 (END_A0, END_B1) 11 10倍 (END_A1, END_B1) 注意仅在工作模式动平衡时有效振动模式下该字段无效响应帧0x82字段值说明数据1原值回显请求的数据1数据2状态码设置结果数据30x00保留数据40x00保留数据2状态码定义0x00 设置成功0x01 参数错误传感器或模式无效0x02 增益配置错误0x03 硬件故障0xFF 未知错误4.3 命令 0x03/0x83 - 配置查询请求帧0x03所有数据字段填 0x00响应帧0x83返回当前的数据1~4配置格式同命令0x024.4 命令 0xF0 - 心跳包字段值说明数据1~40x00全部填0建议每5秒发送一次对方收到后立即原样返回五、硬件GPIO映射关系5.1 MODE引脚控制MODE引脚(工作模式动平衡)?1:0;// 动平衡模式MODE1高电平// 振动模式MODE0低电平5.2 传感器和功能选择引脚四选一A通道switch(数据1){case0x21:IEPE_BAL_A1;break;// IEPE 动平衡case0x22:IEPE_VIB_A1;break;// IEPE 振动case0x11:DIF_BAL_A1;break;// 差分 动平衡case0x12:DIF_VIB_A1;break;// 差分 振动}// 其余3个引脚设为0B通道switch(数据1){case0x31:IEPE_BAL_B1;break;// IEPE 动平衡case0x32:IEPE_VIB_B1;break;// IEPE 振动case0x19:DIF_BAL_B1;break;// 差分 动平衡case0x1A:DIF_VIB_B1;break;// 差分 振动}// 其余3个引脚设为05.3 增益控制引脚振动模式VIB_A0(数据20x01);VIB_A1(数据20x02)1;动平衡模式// 前级增益INT_AMP_A0(数据30x01);INT_AMP_A1(数据30x02)1;// 频率选择INT_FREQ_SEL(数据40x80)7;// 后级增益END_A(数据40x01);END_B(数据40x02)1;六、完整通信示例示例1查询电量请求帧AA 01 00 00 00 00 01 55字段值说明帧头0xAA固定命令0x01读取电量数据1~40x00无数据校验0x010x010x00×40x01帧尾0x55固定响应帧AA 81 50 01 00 00 D2 55字段值说明命令0x81电量响应数据10x50电量80%数据20x01正在充电校验0xD20x810x500x010xD2示例2IEPE传感器 A通道 振动模式 5倍增益请求帧AA 02 22 02 00 00 26 55字段值二进制说明命令0x02-设置配置数据10x2200100010IEPE(010) A通道(0) 振动(0010)数据20x0200000010VIB增益10(5倍)数据30x00-振动模式下无效数据40x00-振动模式下无效校验0x26-0x020x220x020x26硬件配置结果MODE0;// 振动模式IEPE_VIB_A1;// 其余选择引脚0VIB_A00;// 增益5倍VIB_A11;响应帧AA 82 22 00 00 00 A4 55字段值说明数据10x22回显配置数据20x00设置成功示例3差分传感器 B通道 动平衡 完整增益配置配置需求传感器差分通道B模式动平衡积分频率0.5~10Hz前级增益20倍后级增益5倍请求帧AA 02 19 00 03 82 A0 55字段值二进制说明命令0x02-设置配置数据10x1900011001差分(001) B通道(1) 动平衡(0001)数据20x00-动平衡模式下VIB增益无效数据30x0300000011前级增益11(20倍)数据40x8210000010频率1(0.5~10Hz) 后级10(5倍)校验0xA0-0x020x190x000x030x820xA0硬件配置结果MODE1;// 动平衡模式DIF_BAL_B1;// 其余选择引脚0INT_FREQ_SEL1;// 0.5~10HzINT_AMP_A01;// 前级20倍INT_AMP_A11;END_A0;// 后级5倍END_B1;响应帧AA 82 19 00 00 00 9B 55示例4查询当前配置请求帧AA 03 00 00 00 00 03 55响应帧假设当前为示例3的配置AA 83 19 00 03 82 21 55字段值说明命令0x83配置响应数据10x19差分B通道动平衡数据20x00VIB增益当前无效数据30x03前级增益20倍数据40x82频率0.5~10Hz 后级5倍示例5心跳包请求/响应相同AA F0 00 00 00 00 F0 55七、错误处理7.1 常见错误码错误码说明处理建议0x01传感器或模式配置错误检查数据1的Bit[7:5]和Bit[3:0]0x02增益配置超出范围检查数据2/3/4的位域值0x03硬件故障重启设备或检查硬件连接0xFF未知错误重试或联系技术支持7.2 校验失败处理STM32收到校验错误的帧丢弃不响应PC端超时未收到响应建议500ms重发请求最多重试3次7.3 四选一引脚冲突检测// 上位机设置前检查if(IEPE_BAL_AIEPE_VIB_ADIF_BAL_ADIF_VIB_A!1){返回错误码0x01;// 仅允许1个引脚为高}八、通信流程图PC端 STM32端 │ │ ├──── [0x01] 查询电量 ────────→│ │ ├─ 读取电量计 │←──── [0x81] 返回80% ─────────┤ │ │ ├──── [0x02] 设置配置 ────────→│ │ (IEPEA通道振动5倍) │ │ ├─ 验证参数 │ ├─ 配置GPIO │←──── [0x82] 设置成功 ────────┤ │ │ ├──── [0x03] 查询配置 ────────→│ │ ├─ 读取当前状态 │←──── [0x83] 返回配置 ────────┤ │ │ │ 定时发送心跳包 │ ├──── [0xF0] 心跳 ────────────→│ │←──── [0xF0] 心跳回应 ─────────┤ │ │九、快速参考表9.1 数据1常用值速查配置数据1硬件引脚IEPE传感器、A通道、动平衡0x21IEPE_BAL_AIEPE传感器、A通道、振动0x22IEPE_VIB_AIEPE传感器、B通道、动平衡0x31IEPE_BAL_BIEPE传感器、B通道、振动0x32IEPE_VIB_B差分传感器、A通道、动平衡0x11DIF_BAL_A差分传感器、A通道、振动0x12DIF_VIB_A差分传感器、B通道、动平衡0x19DIF_BAL_B差分传感器、B通道、振动0x1ADIF_VIB_B9.2 振动增益速查数据2增益数据2VIB_A0VIB_A10.5倍0x00001倍0x01105倍0x020110倍0x03119.3 动平衡前级增益速查数据3增益数据3INT_AMP_A0INT_AMP_A12.5倍0x00005倍0x011010倍0x020120倍0x03119.4 动平衡后级增益速查数据4频率范围后级增益数据4INT_FREQ_SELEND_AEND_B5~200Hz1倍0x000005~200Hz2.5倍0x010105~200Hz5倍0x020015~200Hz10倍0x030110.5~10Hz1倍0x801000.5~10Hz2.5倍0x811100.5~10Hz5倍0x821010.5~10Hz10倍0x83111十、实现建议10.1 STM32端伪代码voidparse_command(uint8_t*frame){// 1. 校验帧头帧尾if(frame[0]!0xAA||frame[7]!0x55)return;// 2. 校验和验证uint8_tsumframe[1]frame[2]frame[3]frame[4]frame[5];if(sum!frame[6])return;// 3. 命令处理switch(frame[1]){case0x01:// 查询电量send_battery_response();break;case0x02:// 设置配置uint8_tresultapply_config(frame[2],frame[3],frame[4],frame[5]);send_config_response(frame[2],result);break;case0x03:// 查询配置send_current_config();break;case0xF0:// 心跳send_heartbeat();break;}}uint8_tapply_config(uint8_tdata1,uint8_tdata2,uint8_tdata3,uint8_tdata4){// 1. 解析数据1uint8_tsensor(data15)0x07;uint8_tchannel(data14)0x01;uint8_tmodedata10x0F;// 2. 参数验证if(sensor0||sensor2)return0x01;// 传感器错误if(mode0||mode2)return0x01;// 模式错误// 3. 设置MODE引脚HAL_GPIO_WritePin(MODE_GPIO_Port,MODE_Pin,(mode0x01)?GPIO_PIN_SET:GPIO_PIN_RESET);// 4. 设置四选一引脚此处仅展示A通道示例if(channel0){// A通道HAL_GPIO_WritePin(IEPE_BAL_A_GPIO_Port,IEPE_BAL_A_Pin,(sensor2mode1)?GPIO_PIN_SET:GPIO_PIN_RESET);HAL_GPIO_WritePin(IEPE_VIB_A_GPIO_Port,IEPE_VIB_A_Pin,(sensor2mode2)?GPIO_PIN_SET:GPIO_PIN_RESET);HAL_GPIO_WritePin(DIF_BAL_A_GPIO_Port,DIF_BAL_A_Pin,(sensor1mode1)?GPIO_PIN_SET:GPIO_PIN_RESET);HAL_GPIO_WritePin(DIF_VIB_A_GPIO_Port,DIF_VIB_A_Pin,(sensor1mode2)?GPIO_PIN_SET:GPIO_PIN_RESET);}// 5. 设置增益if(mode0x02){// 振动模式HAL_GPIO_WritePin(VIB_A0_GPIO_Port,VIB_A0_Pin,(data20x01)?GPIO_PIN_SET:GPIO_PIN_RESET);HAL_GPIO_WritePin(VIB_A1_GPIO_Port,VIB_A1_Pin,(data20x02)?GPIO_PIN_SET:GPIO_PIN_RESET);}else{// 动平衡模式HAL_GPIO_WritePin(INT_AMP_A0_GPIO_Port,INT_AMP_A0_Pin,(data30x01)?GPIO_PIN_SET:GPIO_PIN_RESET);HAL_GPIO_WritePin(INT_AMP_A1_GPIO_Port,INT_AMP_A1_Pin,(data30x02)?GPIO_PIN_SET:GPIO_PIN_RESET);HAL_GPIO_WritePin(INT_FREQ_SEL_GPIO_Port,INT_FREQ_SEL_Pin,(data40x80)?GPIO_PIN_SET:GPIO_PIN_RESET);HAL_GPIO_WritePin(END_A_GPIO_Port,END_A_Pin,(data40x01)?GPIO_PIN_SET:GPIO_PIN_RESET);HAL_GPIO_WritePin(END_B_GPIO_Port,END_B_Pin,(data40x02)?GPIO_PIN_SET:GPIO_PIN_RESET);}return0x00;// 成功}10.2 PC端Python示例importserialimportstructclassDM4Protocol:def__init__(self,portCOM3,baudrate115200):self.serserial.Serial(port,baudrate,bytesize8,stopbits2,timeout0.5)def_calc_checksum(self,data):计算校验和returnsum(data)0xFFdef_send_frame(self,cmd,data10,data20,data30,data40):发送帧framebytearray([0xAA,cmd,data1,data2,data3,data4,self._calc_checksum([cmd,data1,data2,data3,data4]),0x55])self.ser.write(frame)returnself._receive_frame()def_receive_frame(self):接收帧dataself.ser.read(8)iflen(data)!8ordata[0]!0xAAordata[7]!0x55:returnNone# 校验calc_sumself._calc_checksum(data[1:6])ifcalc_sum!data[6]:returnNonereturn{cmd:data[1],data1:data[2],data2:data[3],data3:data[4],data4:data[5]}defread_battery(self):读取电量respself._send_frame(0x01)ifrespandresp[cmd]0x81:return{level:resp[data1],charging:resp[data2]1}returnNonedefset_config(self,sensor,channel,mode,vib_gainNone,bal_paramsNone): 设置配置 sensor: DIF(差分) 或 IEPE channel: A 或 B mode: BAL(动平衡) 或 VIB(振动) vib_gain: 振动增益 0.5/1/5/10 bal_params: 动平衡参数字典 {freq:LOW/HIGH, front:2.5/5/10/20, back:1/2.5/5/10} # 构造数据1sensor_code1ifsensorDIFelse2channel_code0ifchannelAelse1mode_code1ifmodeBALelse2data1(sensor_code5)|(channel_code4)|mode_code# 构造增益数据data2,data3,data40,0,0ifmodeVIBandvib_gain:gain_map{0.5:0,1:1,5:2,10:3}data2gain_map.get(vib_gain,0)elifmodeBALandbal_params:front_map{2.5:0,5:1,10:2,20:3}back_map{1:0,2.5:1,5:2,10:3}data3front_map.get(bal_params[front],0)data4(17ifbal_params[freq]LOWelse0)|back_map.get(bal_params[back],0)respself._send_frame(0x02,data1,data2,data3,data4)ifrespandresp[cmd]0x82:returnresp[data2]0# 成功返回TruereturnFalsedefread_config(self):读取当前配置respself._send_frame(0x03)ifrespandresp[cmd]0x83:return{data1:resp[data1],data2:resp[data2],data3:resp[data3],data4:resp[data4]}returnNone# 使用示例if__name____main__:dm4DM4Protocol(COM3)# 查询电量batterydm4.read_battery()print(f电量:{battery[level]}%, 充电中:{battery[charging]})# 设置IEPE传感器、A通道、振动模式、5倍增益successdm4.set_config(IEPE,A,VIB,vib_gain5)print(f配置设置:{成功ifsuccesselse失败})# 设置差分传感器、B通道、动平衡模式successdm4.set_config(DIF,B,BAL,bal_params{freq:LOW,front:20,back:5})print(f配置设置:{成功ifsuccesselse失败})十一、常见问题FAQQ1: 为什么动平衡模式需要3个增益参数A: 动平衡需要积分电路处理信号包含前级放大→积分→后级放大三个级联环节每个环节都需要独立设置增益。Q2: 振动模式和动平衡模式可以同时使用吗A: 不可以。MODE引脚只能选择一种模式且四选一引脚确保同一时间只有一个传感器功能激活。Q3: 如何计算总增益A:振动模式总增益 VIB增益动平衡模式总增益 前级增益 × 后级增益Q4: 数据2~4在错误模式下会被忽略吗A: 是的。例如振动模式下数据3和数据4不会配置到硬件但建议填0以保持协议规范。Q5: 心跳包为什么要设计为双向A: 双向心跳可以检测收发双方的通信状态任意一方超时未响应都表明链路异常。附录协议修订对比项目v1.0v2.0传感器类型单端/差分/IEPE差分/IEPE删除单端通道支持无A/B双通道增益配置单字节不完整多字节完整支持数据字段2个预留字段4个有效数据字段硬件映射未说明完整GPIO映射表文档结束