单片机协议解析程序编写模板

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、数据链路层
    • 1.1 定义一个fifo数据结构
    • 1.2 在单片机接收 地方定义数据
  • 二、传输层
    • 2.1 定义传输层层文件
    • 2.2 接受解析
  • 三、 应用层
    • 3.1 定义应用层数据结构
  • 总结


前言

在单片机编程中,有很多项目都定义协议,通过不同的硬件去传输数据,我们需要解析这些数据,我们可以定义一个程序模板来完成这些功能。


提示:以下是本篇文章正文内容,下面案例可供参考

一、数据链路层

1.1 定义一个fifo数据结构

     参考博客里面的自建C函数库

1.2 在单片机接收 地方定义数据

    命名规则如下:
    fifo_TypeDef g_xxxTxFifo;
    fifo_TypeDef g_xxxTxFifo;
    例如:fifo_TypeDef   g_canTxFifo;
              fifo_TypeDef g_canRxFifo;
    调用 fifo_insert      函数将数据传输到fifo结构
       uint32_t tpChannelToCanChannel[1] =

{

	CAN4_ADDR,

}; 定义通道

二、传输层

2.1 定义传输层层文件

2.2 接受解析

1)在传输层定义数据结构 TpRxCtrlSTypeDef tpRxCtrl[TpChannelCount];
2)在传输层调用应用层内存分配函数, 应用层的函数通过宏定义传递

#define __TpRxGetBuffer(tpChannel, dataLength)      UdsRxGetBuffer(tpChannel, dataLength)
tpRxCtrl[tpChannel].DataPtr = __TpRxGetBuffer(tpChannel, temp_SF_DL);
uint8_t* UdsRxGetBuffer(uint8_t tpChannel, uint16_t bufferLength)
{
    if (bufferLength > UdsMaxBufferLength)
    {
        return NULL;
    }        
    if (s_udsDataBufferFlag[tpChannel] == 0)
    {
        s_udsDataBufferFlag[tpChannel] = 1;
        return s_udsDataBuffer[tpChannel];
    }
    else
    {
        return NULL;
    }
}
3)传输层中实现TpRxTask(void)
   void TpRxTask(void)
{
    uint8_t tpChannel;
  
    if (fifo_GetLen(&g_canRxFifo) >= 8)
    {
        fifo_retrieve(&g_canRxFifo, tpRxCtrl[tpChannel].DataPtr, len);  
        TpCanRxProcess(tpChannelToCanChannel[0], tpRxCtrl[tpChannel].DataPtr,len);
    }
   }
   4)将传输层的数据拷贝给应用层;通过宏定义实现
   #define __TpReciveDataInd(tpChannel, pData, dataLength)      UdsDataIndication(tpChannel, pData, dataLength)
   #define __TpRxReleaseBuffer(tpChannel)      UdsRxReleaseBuffer(tpChannel)
   void UdsRxReleaseBuffer(uint8_t tpChannel)
	{
	    s_udsDataBufferFlag[tpChannel] = 0;
	}
	
   TpCanRxProcess(uint8_t canHandle , uint8_t *data,uint16 len)
   {
       uint8_t tpChannel = 0;
    for (tpChannel=0;tpChannel= TpChannelCount)
    {
        return;
    }
       __TpReciveDataInd(tpChannel, data, len);//传递给应用层;在应用层解析
       __TpRxReleaseBuffer(tpChannel) ;//释放缓存
  }






三、 应用层

3.1 定义应用层数据结构

   1) MsgContextType g_msgContext;
    void UdsDataIndication(uint8_t tpRxChannel, uint8_t *pDataBuf, uint16_t length)

{
if (g_udsState == 0)return;

/* restore context */
g_msgContext.reqData = pDataBuf;
g_msgContext.reqLen = length;
g_msgContext.TAtype = 0;    ///

}
2) 去解析 数据
UdsDispatcher();
一般在UdsDispatcher函数中,都是采用擦表法去给自定义数据结构中的数据去传递数据,

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

你可能感兴趣的:(单片机,嵌入式硬件)