资产监测设备中关于OTA升级串口应答帧处理

Posted 瑞奇Ricky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了资产监测设备中关于OTA升级串口应答帧处理相关的知识,希望对你有一定的参考价值。

近期笔者的团队正在筹备对资产监测设备中的OTA升级串口应答帧处理。
关于该问题笔者首先需要介绍关于资产监测设备的基础知识,然后再通过代码阐述关于OTA升级串口应答帧处理方式。

资产监测设备简介:
资产监测设备是通过多种定位方式与传感技术,将设备所处的环境位置信息与状态信息采集,再通过通信模块与网络进行数据传递。用户只需要登录资产监测设备的云端后台,即可随时随地了解资产的信息。避免资产丢失与受损。资产监测设备被广泛应用于物流行业。

资产监测设备中关于OTA升级串口应答帧处理流程:

void UART_IRQHandler(void)
{
uint8_t recvData;
uint16_t u16Crc16;

if (HC32_GetUartErrStatus()) //获取串口异常标志位
{
HC32_ClrUartErrStatus(); //清除串口异常标志位
}

if (HC32_GetUartRCStatus()) //获取串口数据接收标志位
{
HC32_ClrUartRCStatus(); //清除串口数据接收标志位

   u32FrameRecvOverTime = 0;                                       //帧接收超时计数器,清零
   recvData = HC32_GetUartBuff();                                  //获取串口接收数据

switch(enFrameRecvStatus)
{
case FRAME_RECV_IDLE_STATUS : //当前处于空闲状态
if (recvData == FRAME_HEAD_L) //收到帧头第一个字节
{
u8FrameData[FRAME_HEAD_H_INDEX] = recvData; //保存数据
enFrameRecvStatus = FRAME_RECV_HEADER_STATUS; //帧接收进入下一状态: 空闲状态
}
break;
case FRAME_RECV_HEADER_STATUS : //当前处于接收帧头状态
if (recvData == FRAME_HEAD_H) //收到帧头第二个字节
{
u8FrameData[FRAME_HEAD_L_INDEX] = recvData; //保存数据
u32FrameDataIndex = FRAME_NUM_INDEX; //数组下标从帧头的下一位置开始计数
enFrameRecvStatus = FRAME_RECV_DATA_STATUS; //帧接收进入下一状态: 接收帧数据状态
}else if (recvData == FRAME_HEAD_L) //收到帧头第一个字节
{
u8FrameData[FRAME_HEAD_H_INDEX] = recvData; //保存数据
enFrameRecvStatus = FRAME_RECV_HEADER_STATUS; //帧接收进入下一状态
}else //数据错误
{
enFrameRecvStatus = FRAME_RECV_IDLE_STATUS; //帧接收恢复到初始状态: 空闲状态
}
break;
case FRAME_RECV_DATA_STATUS : //当前处于接收帧数据状态
u8FrameData[u32FrameDataIndex++] = recvData;
if (u32FrameDataIndex == (FRAME_NUM_INDEX+2)) //已经接收到数据帧序号及校验值
{
if ((u8FrameData[FRAME_NUM_INDEX] != (u8FrameData[FRAME_XORNUM_INDEX] ^ FRAME_NUM_XOR_BYTE))) //数据帧序号及校验值不匹配
{
enFrameRecvStatus = FRAME_RECV_IDLE_STATUS; //帧接收恢复到初始状态
return; //错误返回
}
}else if (u32FrameDataIndex == (FRAME_LENGTH_INDEX+2)) //已经收到包长度数据
{
u32FrameSize = u8FrameData[FRAME_LENGTH_INDEX] + (u8FrameData[FRAME_LENGTH_INDEX + 1] << 8) + FRAME_SHELL_SIZE; //计算此帧的长度
if ((u32FrameSize < FRAME_MIN_SIZE) || (u32FrameSize > FRAME_MAX_SIZE)) //帧长度不在有效范围内
{
enFrameRecvStatus = FRAME_RECV_IDLE_STATUS; //帧接收恢复到初始状态
return; //错误返回
}
}else if ((u32FrameDataIndex > (FRAME_LENGTH_INDEX+2)) && (u32FrameDataIndex == u32FrameSize)) //帧数据接收完毕
{
u16Crc16 = u8FrameData[u32FrameDataIndex-2] + (u8FrameData[u32FrameDataIndex-1]<<8);
if (Cal_CRC16(&u8FrameData[FRAME_PACKET_INDEX], (u32FrameSize-FRAME_SHELL_SIZE)) == u16Crc16) //如果CRC校验通过
{
enFrameRecvStatus = FRAME_RECV_PROC_STATUS; //帧接收进入下一状态: 帧处理状态
}else //校验失败
{
enFrameRecvStatus = FRAME_RECV_IDLE_STATUS; //帧接收恢复到初始状态
return; //错误返回
}
}
break;
case FRAME_RECV_PROC_STATUS : //当前处于帧处理状态
break;
}
}
}

正在从事软件相关工作或学习的用户可参考以上文档,笔者希望能够帮助到大家!

以上是关于资产监测设备中关于OTA升级串口应答帧处理的主要内容,如果未能解决你的问题,请参考以下文章

资产监测设备中关于天线结构问题

环境监测技术中关于芯片串口串电可能导致的现象

资产监测设备中关于AES加密应用

环境监测设备中对BC260Y进行OTA升级

资产监测设备中关于HALL开环电流传感器介绍

资产监测设备中关于ADC128S052简介