==上位机(CPU)与下位机（STM32）通讯协议==

====物理层协议====
*通过串口通讯，115200波特率，校验位无，数据位8位，停止位1位
=====帧格式表=====
{| class="wikitable sortable"
|-
! 起始位   !! 数据位 !! 校验位置 !! 结束位置
|-
|0xA5 1个字节长度||见数据位表，变长||数据位CRC16校验，2个字节长度，低位在前||0x5A 1个字节长度
|}

=====数据位表=====
{| class="wikitable sortable"
|-
! 数据来源地址  !! 目的地址 !! 帧序号 !!数据长度 !! 数据命令以及数据内容
|-
|0x01表示第一块CPU板，0x02表示第二块CPU板，0x03表示第三块CPU板；<br>0x81表示第一块STM32板，0x82表示第二块STM32电路板，0x83表示第二块STM32电路板，一个字节||0x01表示第一块CPU板，0x02表示第二块CPU板，0x03表示第三块CPU板；<br>0x81表示第一块STM32板，0x82表示第二块STM32电路板，0x83表示第二块STM32电路板；<br>0x80表示目的地址是广播给所有的CPU电路板，0xfe表示目的地址是所有的STM32电路板，0xff表示广播给系统中所有设备，其他地址备用，一个字节长度||帧序号，两个字节，低位在前，应答数据的帧序号与收到的帧序号相同||数据命令以及数据内容部分数据长度，两个字节，低位在前||见数据命令以及数据内容表（'''是否需要回复'''是数据内容最后一个字节），变长
|}

=====数据命令以及数据内容表=====
{| class="wikitable sortable"
|-
! 命令序号（两个字节长度）   !! 命令内容 !! 是否需要回复!! 备注
|-
|1，CPU读取STM32硬件版本号||无||0表示无需返回，1表示需要返回||
|-
|2，STM32回复硬件版本号||例如，"HMHD.VT.A1"||0表示无需返回||
|-
|3，CPU读取STM32软件版本号||无||0表示无需返回，1表示需要返回||
|-
|4，STM32回复软件版本号||例如，"VT.A1.1907171",||0表示无需返回||

|-
|5，STM32主动上传硬件版本||例如，"HMHD.VT.A1"||0表示无需返回，1表示需要返回||
|-
|6，CPU应答||数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回||
|-
|7，STM32主动上传软件版本||例如，"VT.A1.1907171"||0表示无需返回，1表示需要返回||
|-
|8，CPU应答||数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回||
|-

|9，CPU提出升级STM32代码||无||0表示无需返回，1表示需要返回||
|-
|10，STM32回复CPU提出升级STM32代码||数据正常应答0x00（STM32进入升级状态）,错误应答0x01,一个字节长度||0表示无需返回||
|-
|11，CPU发送代码数据长度给STM32||4个字节长度,低位在前，低位在后||0表示无需返回，1表示需要返回||
|-
|12，STM32应答CPUX发送代码数据长度给STM32||数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回||
|-
|13，CPU发送代码数据给STM32||见'''CPU发送代码数据给STM32数据内容表'''||0表示无需返回，1表示需要返回||
|-
|14，STM32应答CPU发送代码数据给STM32||'''STM32应答CPU发送代码数据给STM32表'''||0表示无需返回||
|-
|15，CPU发送数据升级完毕||无||0表示无需返回，1表示需要返回||
|-
|16，STM32应答CPU发送数据升级完毕||数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回||
|-
|17，CPU发送强行结束升级命令||无 ||0表示无需返回，1表示需要返回||
|-
|18，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回||
|-
|19，STM32主动上报升级完成命令||升级是否成功标志,1个字节（0，STM32升级成功，1，STM32升级未成功），例如，"VT.A1.1907172"||1表示需返回||
|-
|20，CPU应答升级||无||0表示无需返回||
|}

=====数据命令以及数据内容表，与产气相关命令=====
{| class="wikitable sortable"
|-
! 命令序号（两个字节长度）   !! 命令内容 !! 是否需要回复!! 备注
|-
|129,STM32上报系统状态切换||上一个系统状态（1个字节，'''3,空闲状态；4准备产气状态，5产气状态，6产气2小时补水前15S延时状态，7产气2小时15S后补水状态，8产气暂停状态，9电机找位置状态），当前系统状态（1个字节），切换成功与否(1个字节，0切换成功，1切换失败),当前'''系统状态运行标识码'''（8个字节） ||0表示无需返回，1表示需要返回 ||
|-
|130，CPU应答|| 数据正常应答0x00,错误应答0x01||0表示无需返回||
|-
|131,CPU下达开始产气命令|| 产气时间，4个字节，单位秒，低位在前；产气量，1个字节：0，低，1：中，2：高，其他无效；雾化量(1个字节)：0 - 6，其他无效;电解电源极性(1个字节)：0正常极性，1反转极性; 是否是睡眠模式，1个字节，0不是睡眠，1是睡眠模式；是否检查开始产气湿化杯超高，一个字节，0不检查，1检查||0表示无需返回，1表示需要返回 ||
|-
|132，STM32应答|| 数据正常，且满足产气条件应答0x00,其他应答0x01,一个字节长度。当前'''系统状态运行标识码'''（8个字节）||0表示无需返回||
|-
|133,CPU发送停止产气命令|| 无 ||0表示无需返回，1表示需要返回 ||
|-
|134，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。(在产气准备状态下，非产气状态，产气补水状态下，产气暂停状态下，返回0x00)||0表示无需返回||
|-
|135,CPU发送暂停产气命令|| 无 ||0表示无需返回，1表示需要返回 ||
|-
|136，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。(在非产气准备状态下，非产气状态，非产气补水状态下，返回0x01)||0表示无需返回||
|-
|137,CPU发送恢复产气命令|| 产气量，1个字节：0，低，1：中，2：高，其他无效；雾化量,一个字节：0 - 6，其他无效; ||0表示无需返回，1表示需要返回 ||
|-
|138，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。(在非产气暂停状态下，返回ox01)||0表示无需返回||
|-
|139,产气过程中，CPU发送雾化量控制命令|| 1个字节，0 - 6 ||0表示无需返回，1表示需要返回 ||
|-
|140，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。(在产气准备状态下，非产气状态，产气补水状态下，产气暂停状态下，返回0x01)||0表示无需返回||
|-
|141,准备产气状态下，STM32上报|| 产气设置时间（4个字节，低位在前），产气运行时间（4个字节，低位在前），准备产气运行时间（4个字节，低位在前）， '''系统状态运行标识码'''，8个字节 ||0表示无需返回，1表示需要返回 ||1S定时上报一次
|-
|142，CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||
|-
|143,准备产气状态下，STM32上报准备产气超时|| 产气设置时间（4个字节，低位在前），产气运行时间（4个字节，低位在前），准备产气运行时间（4个字节，低位在前）， '''系统状态运行标识码'''，8个字节 ||0表示无需返回，1表示需要返回 ||
|-
|144，CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||
|-
|145,产气状态下，STM32上报产气过程|| 产气设置时间（4个字节，低位在前），产气运行时间（4个字节，低位在前），设置产气挡位（1个字节，0，低，1：中，2：高），雾化量(1个字节)：0 - 6，其他无效， '''系统状态运行标识码'''，8个字节 ||0表示无需返回，1表示需要返回 ||1S定时上报一次
|-
|146，CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||
|-
|147,产气状态下，STM32上报产气时间到|| 产气设置时间（4个字节，低位在前），产气运行时间（4个字节，低位在前），设置产气挡位（1个字节，0，低，1：中，2：高），雾化量(1个字节)：0 - 6，其他无效， '''系统状态运行标识码'''，8个字节 ||0表示无需返回，1表示需要返回 ||1S定时上报一次
|-
|148，CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||
|-
|149,产气中补水15S等待状态下，STM32上报|| 产气设置时间（4个字节，低位在前），产气运行时间（4个字节，低位在前），等待运行时间（4个字节，低位在前）， '''系统状态运行标识码'''，8个字节 ||0表示无需返回，1表示需要返回 ||1S定时上报一次
|-
|150，CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||
|-
|151,产气中补水15S等待超时，进入正式补水状态|| 产气设置时间（4个字节，低位在前），产气运行时间（4个字节，低位在前），等待运行时间（4个字节，低位在前）， '''系统状态运行标识码'''，8个字节 ||0表示无需返回，1表示需要返回 ||1S定时上报一次
|-
|152，CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||
|-
|153,产气中补水状态下，STM32上报|| 产气设置时间（4个字节，低位在前），产气运行时间（4个字节，低位在前），补水运行时间（4个字节，低位在前）， '''系统状态运行标识码'''，8个字节 ||0表示无需返回，1表示需要返回 ||1S定时上报一次
|-
|154，CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||
|-
|155,产气中补水状态下，补水超时|| 产气设置时间（4个字节，低位在前），产气运行时间（4个字节，低位在前），补水运行时间（4个字节，低位在前）， '''系统状态运行标识码'''，8个字节 ||0表示无需返回，1表示需要返回 ||
|-
|156，CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||
|-
|157,准备产气时，水箱水位正常，进入真正产气状态||  '''系统状态运行标识码'''，8个字节 ||0表示无需返回，1表示需要返回 ||
|-
|158，CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||
|-
|159,2小时加水时，水箱水位正常，进入产气状态||  '''系统状态运行标识码'''，8个字节 ||0表示无需返回，1表示需要返回 ||
|-
|160，CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||
|-
|161，CPU产气过程睡眠与否设置||  一个字节，0标识非睡眠模式；1标识睡眠模式；其他数据无效 ||0表示无需返回，1表示需要返回 ||
|-
|162，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||
|-
|255，CPU下发关机命令|| 无 ||1表示需要应当||
|-
|256，STM32应答|| 数据正常，0，数据错误，1 || 0表示不需要返回 ||'
|-
|}

=====系统状态运行标识码=====
{| class="wikitable sortable"
|-
! 状态数据!! bit0 !! bit1 !! bit2 !! bit3 !! bit4 !! bit5 !! bit6 !! bit7 !!说明 !! 备注
|-
|数据1,1个字节|| 水箱低于低水位，1||水箱低于高水位1||湿化杯低于低水位1||湿化杯低于中水位1 || 湿化杯低于高水位1 || 湿化杯高于超高水位1 || 氢水杯低于低1 ||氢水杯高于高 || ||
|-
|数据2,1个字节|| 雾化器低于低1 ||雾化器高于高1 || 备用||备用||水箱温度过高于75||水箱平均温度过高于70 || 雾化器温度过高|| 备用 ||  ||
|-
|数据3,1个字节|| 备用||氢气浓度超标1||风扇1故障1||风扇2故障1 || 电源IIC故障|| 电源未接地 || 电源过温 ||电源过压 || ||
|-
|数据4,1个字节|| 电源欠压||电源过流||减速电机位置出错||氢水杯不在线 ||灯板不在线|| 备用 || 备用 ||备用|| ||
|-
|数据5,1个字节|| 备用||备用||备用 || 备用 || 备用 || 备用 ||备用 || 备用 || ||
|-
|数据6,1个字节|| 备用 ||备用 || 备用||备用||备用||备用 || 备用|| 备用 ||  ||
|-
|数据7,1个字节|| 备用||备用||备用||备用 || 备用|| 备用 || 备用 ||备用 || ||
|-
|数据8,1个字节|| 备用||备用||备用||备用 || 备用|| 备用 || 备用 ||系统状态出错 || ||

|}

=====数据命令以及数据内容表，非产气相关命令=====
{| class="wikitable sortable"
|-
! 命令序号（两个字节长度）   !! 命令内容 !! 是否需要回复!! 备注
|-
|257,STM32上报状态||见'''上报系统状态表''' ||0表示无需返回，1表示需要返回 ||定时上报
|-
|258，CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回||
|-
|259,STM32上报触摸按键状态||1，按键按下；2，按键长按；3，按键重发，其他无效 ||0表示无需返回，1表示需要返回 ||
|-
|260，CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回||
|-
|}

=====CPU设置参数相关命令=====
{| class="wikitable sortable"
|-
! 命令序号（两个字节长度）   !! 命令内容 !! 是否需要回复!! 备注
|-
|385,CPU设置准备产气超时时长||时长（4个字节，低位在前），单位：秒 ||0表示无需返回，1表示需要返回 ||
|-
|386，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回||
|-
|387,CPU设置准备补水等待延时超时时长||时长（4个字节，低位在前），单位：秒 ||0表示无需返回，1表示需要返回 ||
|-
|388，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回||
|-
|389,CPU设置补水超时时长||时长（4个字节，低位在前），单位：秒 ||0表示无需返回，1表示需要返回 ||
|-
|390，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回||
|-
|391,CPU设置最高保护温度阀值||实际温度值+30，一个字节长度 ||0表示无需返回，1表示需要返回 ||
|-
|392，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回||
|-
|393,CPU设置平均保护温度阀值||实际温度值+30，一个字节长度 ||0表示无需返回，1表示需要返回 ||
|-
|394，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回||
|-
|395,CPU设置雾化器保护温度阀值||实际温度值+30，一个字节长度 ||0表示无需返回，1表示需要返回 ||
|-
|396，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回||
|-
|397,CPU设置雾化器极性||一个字节长度，0真极性，其他反极性 ||0表示无需返回，1表示需要返回 ||
|-
|398，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回||
|-
|}

=====软件测试时相关命令=====
{| class="wikitable sortable"
|-
! 命令序号（两个字节长度）   !! 命令内容 !! 是否需要回复!! 备注
|-
|513,CPU发送软件控制指令||1个字节。bit0：1,开启软件控制,0,关闭;bit1：1,开启ADC值软件输入,1,关闭;bit2：1,开启温度值，电流值模拟输入，0，关闭;bit3：1，开启IO输入状态模拟，0关闭;bit4：1，开启IO输出状态模拟，0关闭；其他备用 ||0表示无需返回，1表示需要返回 ||
|-
|514，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||
|-
|515,CPU发送软件ADC值|| 见'''软件AD值控制表'''（只有在开启软件控制且开启ADC值软件输入时候，才可以控制） ||0表示无需返回，1表示需要返回 ||
|-
|516，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||
|-
|517,CPU发送温度值，电流值模拟输入|| 见'''温度值，电流值模拟输入控制表''' ||0表示无需返回，1表示需要返回 ||
|-
|518，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||
|-
|519,CPU发送开启IO输入状态模拟|| 见'''IO输入状态模拟控制表''' ||0表示无需返回，1表示需要返回 ||
|-
|520，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||
|-
|}

=====STM32上报系统状态表=====
{| class="wikitable sortable"
|-
! 状态数据!! 说明 !! 备注
|-
|数据1,1字节(输入)||bit0：电源DC OK信号，0,DC OK;bit1：浮球水位高信号，0，表示水位到高水位处，1表示水位未到;bit2：浮球水位低信号，1，表示水位到低水位处，0表示水位未到;bit3：湿化杯1水位超高信号，1，表示水位到超高水位处;bit4：湿化杯1水位高信号，1，表示水位到高水位处;bit5：湿化杯1水位中信号，1，表示水位到中水位处;bit6：湿化杯1水位低信号，1，表示水位到低水位处;bit7：湿化杯2水位高信号，1，表示水位到高水位处;||
|-
|数据2,1字节(输入)||bit0：湿化杯2水位中信号，1，表示水位到中水位处;bit1：湿化杯2水位低信号，1，表示水位到低水位处;bit2：产气通道不经过阳台;bit3：产气通道经过阳台;bit4：雾化器水位高信号，1，表示水位到高水位处;bit5：雾化器水位低信号，1，表示水位到低水位处，0表示水位未到;bit6：雾化器反馈信号;bit7：CPU输出到STM32 GPIO信号;||
|-
|数据3,1字节(输入)||bit0：按键信号，0表示按键按下，其他备用||
|-
|数据4,1字节(输入)||备用||
|-
|数据5,1字节(输出)||bit0：电源CH1 极性信号。（0正常极性，1极性反转）;bit1：电源CH1开关信号，1打开CH1电源;bit2：电源CH2开关信号，1打开CH2电源;bit3：散热器风扇1打开信号，1打开风扇；bit4：散热器风扇2打开信号，1打开风扇；bit5：LED控制信号0，1打开LED灯；bit6：MU420雾化器打开信号，1打开MU420雾化器;bit7：雾化器温度电源信号，1打开电源;|| 
|-
|数据6,1字节(输出)||bit0：循环水泵打开信号，1打开循环水泵；bit1：真空泵打开信号，1打开真空泵；bit2：电磁阀1，1打开电磁阀1;bit3：电磁阀2，1打开电磁阀2;bit4：485GPIO状态；;bit5：LED 绿色GPIO；bit6：输出到CPU的GPIO状态；bit7：CPU电源开启电源信号，1打开电源|| 
|-
|数据7,1字节(输出)||bit0:雾化器风扇控制信号，1打开雾化器风扇；bit1：正压机GPIO输出信号；其他备份|| 
|-
|数据8,1字节(输出)||备用||
|-
|数据9，10,2个字节||备用||
|-
|数据11，12,2个字节||水温 ADC值，低位在前||
|-
|数据13，14,2个字节||雾化器电流采样 ADC值，低位在前||
|-
|数据15，16,2个字节||雾化器自带温度传感器 ADC值，低位在前||
|-
|数据17，18,2个字节||马达电流采样 ADC值，低位在前||
|-
|数据19，20,2个字节||雾化器水位计传感器 ADC值，低位在前||
|-
|数据21，22,2个字节||备用||
|-
|数据23，24,2个字节||备用||
|-
|数据25，26,2个字节||备用||
|-
|数据27，28,2个字节||水温温度值。数据为实际温度值+30||
|-
|数据29，30,2个字节||备用||
|-
|数据31，32,2个字节||雾化器自带温度传感器温度值。数据为实际温度值+30||
|-
|数据33，34,2个字节||备用||
|-
|数据35，36,2个字节||雾化器水位计传感器温度值。数据为实际温度值+30||
|-
|数据37，38,2个字节||备用||
|-
|数据39，40,2个字节||备用||
|-
|数据41，1个字节||电源是否在线标志，0电源在线，1电源不在线，2电源通讯错误||
|-
|数据42，1个字节||电源i2c读取状态，见电源规格书||
|-
|数据43，1个字节||bit0：1,ch2 on,0,ch2 off;bit1：1,ch1 on,0,ch1 off;bit2：1,ch1 反向;bit3：0，DC ok；其他备用||
|-
|数据44，1个字节||备用||
|-
|数据45，46,2个字节||实际电流||
|-
|数据47，48,2个字节||设置电流||
|-
|数据49，50,2个字节||电源温度||
|-
|数据51，52,2个字节||输出电压||
|-
|数据53，54,2个字节||风扇1,PWM||
|-
|数据55，56,2个字节||风扇1,速度||
|-
|数据57,1个字节||风扇1,是否打开，1打开||
|-
|数据58,1个字节||风扇1,是否异常，1异常||
|-
|数据59，60,2个字节||风扇2,PWM||
|-
|数据61，62,2个字节||风扇2,速度||
|-
|数据63,1个字节||风扇2,是否打开，1打开||
|-
|数据64,1个字节||风扇2,是否异常，1异常||
|-
|数据65 -- 72 96,8个字节||系统状态运行标识码||
|-
|数据73，74,2个字节，氢气浓度||2个字节，氢气浓度x10,比如101，表示氢气浓度位10.1%||
|-
|数据75，76,2个字节，环境温度||2个字节，正常温度值加30，比如数值位28，表示温度位-2摄氏度||
|-
|数据77，78,2个字节，环境亮度||2个字节||
|-
|数据79,80个字节，LED灯板状态0||2个字节||bit0:LED灯状态，1打开LED灯；bit1：红色LED灯状态，1打开红色LED灯（氢气超标打开）；bit2：氢水杯低水位，1到达氢水杯低水位；bit3：氢水杯高水位，1到达氢水杯高水位；bit4:氢水杯是否在线，1，在线；bit6：led灯板是否在线，1在线；其他备用
|-
|数据第81个字节||当前系统状态，1个字节，3,空闲状态；4准备产气状态，5产气状态，6产气2小时补水前15S延时状态，7产气2小时15S后补水状态，8产气暂停状态，9电机找位置状态||
|-
|数据82 -- 96,15个字节||备用||
|-
|}

=====IO输入状态模拟控制表=====
{| class="wikitable sortable"
|-
! 状态数据!! 说明 !! 备注
|-
|数据1,1个字节||bit0：电源DC OK信号，0,DC OK;bit1：浮球水位高信号，0，表示水位到高水位处，1表示水位未到;bit2：浮球水位低信号，0，表示水位到低水位处，1表示水位未到;bit3：湿化杯1水位超高信号，1，表示水位到超高水位处;bit4：湿化杯1水位高信号，1，表示水位到高水位处;bit5：湿化杯1水位中信号，1，表示水位到中水位处;bit6：湿化杯1水位中信号，1，表示水位到低水位处;bit7：湿化杯2水位高信号，1，表示水位到高水位处;||
|-
|数据2,1个字节||bit0：湿化杯2水位中信号，1，表示水位到中水位处;bit1：湿化杯2水位中低信号，1，表示水位到低水位处;bit2：清水杯在线信号1;bit3：清水杯在线信号2;bit4：雾化器水位高信号，1，表示水位到高水位处;bit5：雾化器水位低信号，1，表示水位到低水位处，0表示水位未到;bit6：雾化器反馈信号;bit7：CPU输出到STM32 GPIO信号;||
|-
|数据3,1个字节||bit0：按键信号，0表示按键按下，其他备用||
|-
|数据4,1个字节||备用||
|}

====='''温度值，电流值模拟输入控制表'''=====
{| class="wikitable sortable"
|-
! 状态数据!! 说明 !! 备注
|-
|数据1，2,2个字节||备用||
|-
|数据3，4,2个字节||水温温度值，低位在前||
|-
|数据5，6,2个字节||雾化器电流采样 ADC值，低位在前||
|-
|数据7，8,2个字节||雾化器自带温度传感器 温度值，低位在前||
|-
|数据9，10,2个字节||电流采样 电流值，低位在前||
|-
|数据11，12,2个字节||雾化器水位计传感器 温度值，低位在前||
|-
|数据13，14,2个字节||备用||
|-
|数据15，16,2个字节||备用||
|}

====='''软件AD值控制表'''=====
{| class="wikitable sortable"
|-
! 状态数据!! 说明 !! 备注
|-
|数据1，2,2个字节||备用||
|-
|数据3，4,2个字节||水温 ADC值，低位在前||
|-
|数据5，6,2个字节||备用||
|-
|数据7，8,2个字节||雾化器自带温度传感器 ADC值，低位在前||
|-
|数据9，10,2个字节||电流采样 ADC值，低位在前||
|-
|数据11，12,2个字节||雾化器水位计传感器 ADC值，低位在前||
|-
|数据13，14,2个字节||备用||
|-
|数据15，16,2个字节||备用||
|}

=====335X控制命令表=====

{| class="wikitable sortable"
|-
! 控制命令 !! 说明
|-
|0xXX,1个字节||bit0：电源DC OK信号，0,DC OK;bit1：雾化器水位高信号，0，表示水位到高水位处，1表示水位未到;bit2：雾化器水位低信号，0，表示水位到低水位处，1表示水位未到;bit3：湿化杯水位超高信号，0，表示水位到超高水位处，1表示水位未到;bit4：湿化杯水位高信号，0，表示水位到高水位处，1表示水位未到;bit5：湿化杯水位中信号，0，表示水位到中水位处，1表示水位未到;bit6：湿化杯水位中低信号，0，表示水位到低水位处，1表示水位未到;bit7：注水口盖到位信号，0，表示注水口盖到位;
|}

=====335X发送代码数据给STM32数据内容表=====
{| class="wikitable sortable"
|-
! 代码包序号 !! 代码数据 !! 校验
|-
|0x0001，两个字节，低位在前，表示第一包数据，依次递增||代码数据，256个字节，不够256字节补充0xff||代码数据位（256个字节）CRC16校验，两个字节长度，低位在前
|}

=====STM32应答335X发送代码数据给STM32表=====
{| class="wikitable sortable"
|-
! 代码包序号 !! 应答码
|-
|0x0001，两个字节，低位在前，表示第一包数据，依次递增||0x00表示数据正常，0x01表示错误
|}
==上位机和测试底板STM32通讯协议==
*在工作状态下，每1秒STM32将采集到的数据发送给上位机，上位机无需应答；
*数据传输格式采用大端模式；
====物理层协议====
*通过串口通讯，9600波特率，校验位无，数据位8位，停止位1位
=====帧格式表=====
{| class="wikitable sortable"
|-
! 起始位   !! 数据位 !! 校验位置 !! 结束位置
|-
|0xA5,一个字节长度||见数据位表，变长||数据位异或校验，一个字节长度||0x5A，一个字节长度
|}
=====数据位表=====
{| class="wikitable sortable"
|-
! 数据来源地址  !! 目的地址 !! 数据长度 !! 数据命令以及数据内容
|-
|0xa0表示上位机，0xb0表示惠美7寸A8版本平板，0xb1表示惠美7寸A8版本测试底板，如测试底板发送给上位机则来源地址为0xb1,目的地址为0xa0||0xa0表示上位机，0xb0表示惠美7寸A8版本平板，0xb1表示惠美7寸A8版本测试底板，其他地址备用，一个字节长度||数据命令以及数据内容部分数据长度，两个字节，低位在前||见数据命令以及数据内容表，变长
|}
{| class="wikitable sortable"
|-
! 命令序号   !! 命令内容 !! 是否需要回复!! 备注
|-
|101，生产测试指令， 上位机->测试底板STM32||见'''生产测试数据命令以及数据内容表'''||0表示无需返回，1表示需要返回||
|-
|102，生产测试指令应答||数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回||
|-
|103，测试版主动上报测试版状态||见'''生产测试数据命令以及数据内容表'''||0表示无需返回，1表示需要返回||
|}

=====生产测试数据命令以及数据内容表=====
{| class="wikitable sortable"
|-
! 标示编号   !! 命令字节 !! 测试项数量!! 测试项!!保留字!!测试项附加数据段长度!!数据段
|-
|2个字节，上位机发送，STM32响应和主动上传数据时都需原样复制此编号||1个字节，详见'''命令字列表'''||1个字节||1个字节，详见'''测试项列表'''||1个字节||1个字节||可变长，测试项如只是响应，则0标示OK，1标示执行Fail
|}

=====生产测试命令字列表=====
{| class="wikitable sortable"
|-
! 命令字列表!! 说明
|-
|1||设置指令， 上位机->生产测试底板STM32
|-
|2||设置指令响应， 生产测试底板STM32->上位机
|-
|3||表示测试底板STM32主动上传数据
|}

=====生产测试项列表=====

{| class="wikitable sortable"
|-
! 测试项列表 !! 说明
|-
|0x50|| 设置HIGH状态，全部输出口设置，状态参见设置矩阵
|-
|0x51|| 设置LOW状态，全部输出口设置，状态参见设置矩阵
|}

=====STM32上报接口PIN脚定义=====

{| class="wikitable sortable"
|-
! 接口PIN脚定义 !! 说明
J01_01_NC=1,
J01_02_TXD,
J01_03_RXD,
J01_04_GND,
J02_01_SPK_P,
J02_02_SPK_N,
J08_01_24VP,
J08_02_24VN,
J09_01_POW_P_GPIO1_16_OUT,
J09_02_POW_N,
J09_03_CONT_PA5_DAC_OUT,
J09_04_NC,
J09_05_TMP_PA3_ADC_IN,
J09_06_TMP_POW_P_3V3,
J10_01_POW_3V3,
J10_02_LEVEL_H_PC11_IN,
J10_03_LEVEL_L_PB2_IN,
J10_04_GND,
J10_05_TMP_PC5_ADC_IN,
J10_06_TMP_POW_P_3V3_PB11,
J13_01_24VP_GPIO1_24_OUT,
J13_02_24VN,
J15_01_PC1,
J15_02_NC,
J15_03_PC0_OUT,
J15_04_NC,
J15_05_POW_5V,
J15_06_NC,
J15_07_GND,
J15_08_GPIO1_23_IN,
J15_09_GND,
J15_10_NC,
J15_11_LEVEL_H_PC12_IN,
J15_12_LEVEL_L_PB9_IN,
J16_01_24VP_GPIO1_25_OUT,
J16_02_24VN,
J17_01_24VP_GPIO1_26_OUT,
J17_02_24VN,
J19_01_24VP_GPIO3_18_OUT,
J19_02_24VN,
J20_01_USB_VBUS,
J20_02_DM,
J20_03_DP,
J20_04_GND,
J21_01_GND,
J21_02_GND,
J21_03_5V,
J21_04_5V,
J21_05_GND,
J21_06_GPIO1_19_OUT,
J21_07_GPIO1_20_OUT,
J21_08_PB1_OUT,
J21_09_NC,
J21_10_NC,
J21_11_NC,
J21_12_NC,
J21_13_GPIO2_1_IN,
J21_14_NC,
J21_15_NC,
J21_16_NC,
J21_17_SCL,
J21_18_SDA,
J25_01_24VP_PC10_OUT,
            J25_02_24VN,

            J26_01_MP, PA0_ADC_IN,
            J26_02_MM,
            J26_03_FEEDBACK,

            J34_01_GND,
            J34_02_NC,
            J34_03_AIN_PA2_ADC_IN,
            J34_04_POW_5V,

            J41_01_FAN_N,
            J41_02_24VP_GPIO0_20_OUT,
            J41_03_FAN_FEEDBACK_PB10_PWM_IN,
            J41_04_FAN_CONT_PA8_PWM_OUT,

            J42_01_FAN_N,
            J42_02_24VP_GPIO0_7_OUT,
            J42_03_FAN_FEEDBACK_PC9_PWM_IN,
            J42_04_FAN_CONT_PC8_PWM_OUT,

            J45_01_LEVEL_H_GPIO1_21_IN,
            J45_02_GND,
            J45_03_LEVEL_L_GPIO1_22_IN,
            J45_04_GND,
            J45_05_TMP_PA1_ADC_IN,
            J45_06_POW_3V3,

            J46_01_POW_3V3,
            J46_02_PA6_IN,
            J46_03_SIGNAL,
            J46_04_GND,

            J47_01_POW_5V,
            J47_02_IO_PC4_IN,
            J47_03_GND,

            J49_01_POW_5V,
            J49_02_LEVEL_SH_PC2_IN,
            J49_03_LEVEL_H_PC3_IN,
            J49_04_LEVEL_M_PC6_IN,
            J49_05_LEVEL_L_PC7_IN,
            J49_06_GND,
            UNKOWN,
|}

=======CRC校验算法=======

'''#'''define CRC1(crc,byte) (((crc) >> 8 ) ^ tabel[((crc) ^ (unsigned int) (byte)) & 0XFF]) 

CPU_INT16U const tabel[256]={
  0X0000, 0XC0C1, 0XC181, 0X0140, 0XC301, 0X03C0, 0X0280, 0XC241,  
  0XC601, 0X06C0, 0X0780, 0XC741, 0X0500, 0XC5C1, 0XC481, 0X0440,  
  0XCC01, 0X0CC0, 0X0D80, 0XCD41, 0X0F00, 0XCFC1, 0XCE81, 0X0E40,  
  0X0A00, 0XCAC1, 0XCB81, 0X0B40, 0XC901, 0X09C0, 0X0880, 0XC841,  
  0XD801, 0X18C0, 0X1980, 0XD941, 0X1B00, 0XDBC1, 0XDA81, 0X1A40,  
  0X1E00, 0XDEC1, 0XDF81, 0X1F40, 0XDD01, 0X1DC0, 0X1C80, 0XDC41,  
  0X1400, 0XD4C1, 0XD581, 0X1540, 0XD701, 0X17C0, 0X1680, 0XD641,  
  0XD201, 0X12C0, 0X1380, 0XD341, 0X1100, 0XD1C1, 0XD081, 0X1040,  
  0XF001, 0X30C0, 0X3180, 0XF141, 0X3300, 0XF3C1, 0XF281, 0X3240,  
  0X3600, 0XF6C1, 0XF781, 0X3740, 0XF501, 0X35C0, 0X3480, 0XF441,  
  0X3C00, 0XFCC1, 0XFD81, 0X3D40, 0XFF01, 0X3FC0, 0X3E80, 0XFE41,  
  0XFA01, 0X3AC0, 0X3B80, 0XFB41, 0X3900, 0XF9C1, 0XF881, 0X3840, 
  0X2800, 0XE8C1, 0XE981, 0X2940, 0XEB01, 0X2BC0, 0X2A80, 0XEA41,  
  0XEE01, 0X2EC0, 0X2F80, 0XEF41, 0X2D00, 0XEDC1, 0XEC81, 0X2C40,  
  0XE401, 0X24C0, 0X2580, 0XE541, 0X2700, 0XE7C1, 0XE681, 0X2640,  
  0X2200, 0XE2C1, 0XE381, 0X2340, 0XE101, 0X21C0, 0X2080, 0XE041,  
  0XA001, 0X60C0, 0X6180, 0XA141, 0X6300, 0XA3C1, 0XA281, 0X6240,  
  0X6600, 0XA6C1, 0XA781, 0X6740, 0XA501, 0X65C0, 0X6480, 0XA441,  
  0X6C00, 0XACC1, 0XAD81, 0X6D40, 0XAF01, 0X6FC0, 0X6E80, 0XAE41,  
  0XAA01, 0X6AC0, 0X6B80, 0XAB41, 0X6900, 0XA9C1, 0XA881, 0X6840,  
  0X7800, 0XB8C1, 0XB981, 0X7940, 0XBB01, 0X7BC0, 0X7A80, 0XBA41,  
  0XBE01, 0X7EC0, 0X7F80, 0XBF41, 0X7D00, 0XBDC1, 0XBC81, 0X7C40,  
  0XB401, 0X74C0, 0X7580, 0XB541, 0X7700, 0XB7C1, 0XB681, 0X7640,  
  0X7200, 0XB2C1, 0XB381, 0X7340, 0XB101, 0X71C0, 0X7080, 0XB041,  
  0X5000, 0X90C1, 0X9181, 0X5140, 0X9301, 0X53C0, 0X5280, 0X9241,  
  0X9601, 0X56C0, 0X5780, 0X9741, 0X5500, 0X95C1, 0X9481, 0X5440,  
  0X9C01, 0X5CC0, 0X5D80, 0X9D41, 0X5F00, 0X9FC1, 0X9E81, 0X5E40,  
  0X5A00, 0X9AC1, 0X9B81, 0X5B40, 0X9901, 0X59C0, 0X5880, 0X9841,  
  0X8801, 0X48C0, 0X4980, 0X8941, 0X4B00, 0X8BC1, 0X8A81, 0X4A40,  
  0X4E00, 0X8EC1, 0X8F81, 0X4F40, 0X8D01, 0X4DC0, 0X4C80, 0X8C41,  
  0X4400, 0X84C1, 0X8581, 0X4540, 0X8701, 0X47C0, 0X4680, 0X8641,  
  0X8201, 0X42C0, 0X4380, 0X8341, 0X4100, 0X81C1, 0X8081, 0X4040 
};

static CPU_INT16U CalcCRC(CPU_INT08S *data, CPU_INT32S size)
{
	CPU_INT32S i; 						 
	CPU_INT16U crc = 0; 
 	for (i = 0; i < size; i++) 
	{ 
  		crc = CRC1(crc, data[i]); 
 	} 
 	return crc; 
}

=====说明=====
*
*
*
*
*
*
*
*
*
*