基于通道的CanTp层通信管理方法

著录项
  • CN201110159739.3
  • 20110614
  • CN102201938A
  • 20110928
  • 浙江大学
  • 杨国青;顾宗华;张成硕;陈浩杰;王旭阳
  • H04L12/24
  • H04L12/24 H04L12/56 H04L1/16

  • 浙江省杭州市西湖区浙大路38号
  • 中国,CN,浙江(33)
  • 杭州天勤知识产权代理有限公司
  • 胡红娟
摘要
本发明公开了一种基于通道的CanTp层通信管理方法,其实施步骤如下:1)建立通道状态;2)发送方向接收方发送数据帧时,如果没有发送缓冲则申请发送缓冲并将通道状态标记为请求发送缓冲,获得发送缓冲写入发送缓冲并进行发送,将通道状态标记为发送数据;等待接收方的确认消息并将通道状态标记为等待确认发送;3)接收方接收数据帧时,如果没有接收缓冲则申请接收缓冲并将通道状态标记为请求接收缓冲,获得接收缓冲以后拷贝接收数据,向发送方发送确认消息并将通道状态标记为发送确认,在数据帧发送完毕后将通道状态标记为空闲。本发明利用通道状态来管理CanTp层通信、无需遍历数据帧。具有控制逻辑简单、收发效率高的优点。
权利要求

1.一种基于通道的CanTp层通信管理方法,其特征在于其实施步骤如下:

1)建立用于标记CanTp层全局通信状态的通道状态;

2)发送方通过CanTp层向接收方发送数据帧时,在通道状态为空闲时检查发送缓冲,如果没有发送缓冲则申请发送缓冲并将通道状态标记为请求发送缓冲,获得发送缓冲以后将待发送数据写入发送缓冲进行发送,并将通道状态标记为发送数据;如果发送失败,则将通道状态标记为空闲,否则等待接收方的确认消息并将通道状态标记为等待确认发送;

3)接收方接收数据帧时,首先检查接收缓冲,如果没有接收缓冲则申请接收缓冲并将通道状态标记为请求接收缓冲,获得接收缓冲以后拷贝接收数据,向发送方发送确认消息并将通道状态标记为发送确认,并在数据帧发送完毕后将通道状态标记为空闲。

2.根据权利要求1所述的基于通道的CanTp层通信管理方法,其特征在于:所述步骤3)中向发送方发送确认消息时,如果接收数据帧为多帧的第一帧,则返回发送后续帧的确认消息给接收方并将通道状态标记为发送后续帧,发送方根据确认消息向接收方发送多帧的后续帧;如果接收数据帧为多帧的中间帧,则返回接收后续帧的确认消息给接收方,并将通道状态标记为接收后续帧,发送方根据确认消息继续向接收方发送多帧的后续帧;如果接收方发送的数据帧为单帧或者多帧的最后一帧则返回溢出的确认消息给接收方,并将通道状态标记为空闲。

3.根据权利要求1或2所述的基于通道的CanTp层通信管理方法,其特征在于:所述步骤2)中申请发送缓冲时设置一个申请发送缓冲时限或申请发送缓冲次数值,如果申请发送缓冲时间超过申请发送缓冲时限或者申请发送缓冲次数大于申请发送缓冲次数值,则将通道状态标记为空闲。

4.根据权利要求1或2所述的基于通道的CanTp层通信管理方法,其特征在于:所述步骤3)中申请接收缓冲时设置一个申请接收缓冲时限或申请接收缓冲次数值,如果申请接收缓冲时间超过申请接收缓冲时限或者申请接收缓冲次数大于申请接收缓冲次数值,则将通道状态标记为空闲。

5.根据权利要求1或2所述的基于通道的CanTp层通信管理方法,其特征在于:所述步骤2)中如果接收方取消发送数据帧,则将通道状态标记为空闲。

说明书
技术领域

技术领域

本发明涉及汽车的AUTOSAR通信领域,具体涉及一种基于通道CanTp层的通信管理方法。

背景技术

现代汽车上的许多电控单元,如信息系统、驾驶系统和传感执行系统等,均由汽车网络互连,汽车网络技术已经成为各主流汽车厂商的基础技术构成。汽车网络是指借助双绞线、同轴电缆或者光纤灯通讯介质,将车内众多的控制模块连接起来,使传感器、执行机构和ECU公用一个公共的数据通道,借助通讯协议,在网络控制器的管理下共享传输通道和数据。

AUTOSAR的通信系统采用层次化、模块化的设计。作为AUTOSAR体系中的通信系统,COM通信栈负责所有的信息流的传输,其中诊断信息等大容量数据的传输从上到下需要经过DCM层、PduRouter层、CanTp层、Interface层的处理。其中CanTp层(CAN总线传输层)遵循ISO15765-2标准,负责诊断报文的寻址、拆包与组包,以及网络层定时参数的管理。该模块向下传输的是N_PDU(网络层协议数据单元),其中N_SDU是其数据部分。

根据AUTOSAR标准规定,N_SDU通过通道来解决收发数据通信的管理,CanTp层中需要解决几个问题:

1)多个N_SDU对应同一个通道。某个N_SDU利用通道正在发送数据或者接收数据、使用同一通道的另一N_SDU也需要发送或者接收数据时如果其传送数据时如果发现对应的通道发现正在使用,则放弃当前发送的数据;如果其接收数据时发现对应的通道正在使用,则放弃前面数据的发送,转而接受当前数据。因此,这里需要判断好通道是否在使用,并根据不同的情况来进行处理。

2)数据的传送是发送方和接收方协调处理完成的,发送方发送数据,接收方接收数据并发送控制信息,发送方接收控制信息并且控制发送,因此需要协调好发送方和接收方来使数据传送顺利完成。

对于上面提到的问题,传统的方法是以N_SDU为单位来进行控制,通过对每个N_SDU设置状态来判断当前N_SDU需要进行的操作。但是该方法在判断通道的状态时必须遍历整个N_SDU的控制结构,而且需要大量判断通道的情况,因此,这样会给逻辑判断带来很多不便,影响了数据收发的速度和效率。

发明内容

本发明要解决的技术问题是提供一种利用通道状态来管理CanTp层通信、无需遍历数据帧、控制逻辑简单、收发效率高的基于通道的CanTp层通信管理方法。

为了解决上述技术问题,本法采用的技术方案为:一种基于通道的CanTp层通信管理方法,其实施步骤如下:

1)建立用于标记CanTp层全局通信状态的通道状态;

2)发送方通过CanTp层向接收方发送数据帧时,在通道状态为空闲时检查发送缓冲,如果没有发送缓冲则申请发送缓冲并将通道状态标记为请求发送缓冲,获得发送缓冲以后将待发送数据写入发送缓冲进行发送,并将通道状态标记为发送数据;如果发送失败,则将通道状态标记为空闲,否则等待接收方的确认消息并将通道状态标记为等待确认发送;

3)接收方接收数据帧时,首先检查接收缓冲,如果没有接收缓冲则申请接收缓冲并将通道状态标记为请求接收缓冲,获得接收缓冲以后拷贝接收数据,向发送方发送确认消息并将通道状态标记为发送确认,并在数据帧发送完毕后将通道状态标记为空闲。

作为本发明技术方案的进一步改进:

所述步骤3)中向发送方发送确认消息时,如果接收数据帧为多帧的第一帧,则返回发送后续帧的确认消息给接收方并将通道状态标记为发送后续帧,发送方根据确认消息向接收方发送多帧的后续帧;如果接收数据帧为多帧的中间帧,则返回接收后续帧的确认消息给接收方,并将通道状态标记为接收后续帧,发送方根据确认消息继续向接收方发送多帧的后续帧;如果接收方发送的数据帧为单帧或者多帧的最后一帧则返回溢出的确认消息给接收方,并将通道状态标记为空闲。

所述步骤2)中申请发送缓冲时设置一个申请发送缓冲时限或申请发送缓冲次数值,如果申请发送缓冲时间超过申请发送缓冲时限或者申请发送缓冲次数大于申请发送缓冲次数值,则将通道状态标记为空闲。

所述步骤3)中申请接收缓冲时设置一个申请接收缓冲时限或申请接收缓冲次数值,如果申请接收缓冲时间超过申请接收缓冲时限或者申请接收缓冲次数大于申请接收缓冲次数值,则将通道状态标记为空闲。

所述步骤2)中如果接收方取消发送数据帧,则将通道状态标记为空闲。

本发明具有下述优点:

1、本发明通过在通道控制结构体中建立用于标记CanTp层全局通信状态的通道状态,利用通道控制结构体中的通道状态来管理CanTp层通信、不需要考虑数据帧的状态,有效解决了通道共用时使用权的问题、同一通道在发送和接收时的处理权问题,简化了控制逻辑,减少了代码量,无需遍历数据帧,提高了软件开发效率和CanTp层数据收发效率。

2、本发明通过对通道状态在不同时刻下互斥的状态设置,因此任何时刻通道均处于一种确定的状态,简化了控制逻辑,使处理流程更加方便。

附图说明

图1为本发明实施例的流程示意图。

图2为本发明实施例发送数据的流程示意图。

图3为本发明实施例发送数据成功后的流程示意图。

图4为本发明实施例周期性执行函数的处理流程示意图。

具体实施方式

如图1所示,本发明实施例的基于通道的CanTp层通信管理方法的实施步骤如下:

1)在通道控制结构体中建立用于标记CanTp层全局通信状态的通道状态;

2)发送方通过CanTp层向接收方发送数据帧时,在通道状态为空闲时检查发送缓冲,如果没有发送缓冲则申请发送缓冲并将通道状态标记为请求发送缓冲,获得发送缓冲以后将待发送数据写入发送缓冲并进行发送,将通道状态标记为发送数据;如果发送失败,则将通道状态标记为空闲,否则等待接收方的确认消息并将通道状态标记为等待确认发送;

3)接收方接收数据帧时,首先检查接收缓冲,如果没有接收缓冲则申请接收缓冲并将通道状态标记为请求接收缓冲,获得接收缓冲以后拷贝接收数据,向发送方发送确认消息并将通道状态标记为发送确认,并在数据帧发送完毕后将通道状态标记为空闲。

步骤3)中向发送方发送确认消息时,如果接收数据帧为多帧的第一帧,则返回发送后续帧的确认消息给接收方,并将通道状态标记为发送后续帧,发送方根据确认消息向接收方发送多帧的后续帧;如果接收数据帧为多帧的中间帧,则返回接收后续帧的确认消息给接收方,并将通道状态标记为接收后续帧,发送方根据确认消息继续向接收方发送多帧的后续帧;如果接收方发送的数据帧为单帧或者多帧的最后一帧则返回溢出的确认消息给接收方,并将通道状态标记为空闲,从而可以有效实现基于通道状态对多帧通信的处理。

步骤2)中申请发送缓冲时设置一个申请发送缓冲时限或申请发送缓冲次数值,如果申请发送缓冲时间超过申请发送缓冲时限或者申请发送缓冲次数大于申请发送缓冲次数值,则将通道状态标记为空闲。因此通过重发机制,既可以保证尽最大可能地申请发送缓冲,又可以防止由于大量申请发送缓冲造成的资源耗费,从而可以提高数据帧的收发效率。

步骤3)中申请接收缓冲时设置一个申请接收缓冲时限或申请接收缓冲次数值,如果申请接收缓冲时间超过申请接收缓冲时限或者申请接收缓冲次数大于申请接收缓冲次数值,则将通道状态标记为空闲。因此通过重发机制,既可以保证尽最大可能地申请接收缓冲,又可以防止由于大量申请接收缓冲造成的资源耗费,从而可以提高数据帧的收发效率。

步骤2)中如果接收方取消发送数据帧,则将通道状态标记为空闲。从而又可以保证取消数据帧发送时保证通道状态空闲可用。

通道状态包括空闲、请求发送缓冲、发送数据、等待确认发送、请求接收缓冲、发送确认、发送后续帧、接收后续帧等,这些状态都是互斥状态,即任意时刻通道状态只会是其中的一种状态。

本实施例中,为了便于说明,通道以Channel表示,本实施例中缓冲一律以buffer表示,其中接收方申请buffer即为接收缓冲,发送方申请buffer即为发送缓冲。

本实施例中,通道状态用一个8位的状态字来表示,不同位来表示不同的行为。发送的数据帧分为单帧和多帧,因此实际发送的帧分为单帧(SF、Single Frame)、多帧的第一帧(FF、First Frame)、多帧的后续帧(CF、Consecutive Frame)和控制帧(FC、Flow Control)。其中控制帧又包括FC_OVFLW(OverFlow)、FC_CTS(Clear to Send)还是FC_WT(Wait)。通道状态的第1、2、3位用于标记帧的类型;第4、5位用于标记是发送数据、接收数据还是发送数据的确认;第6、7位用于标记是发送方还是接受方。通道状态具体定义如下:

根据控制帧的类型,本实施例中通道的发送确认状态分为三种:如果是接收方发送FC_WT的确认消息,则将通道状态修改为CANTP_CH_RX_BUFREQ_CF;如果是接收方发送FC_OVFLW的确认消息,则将通道状态修改为CANTP_CH_IDLE;如果是接收方发送FC_CTS的确认消息,将通道状态修改为CANTP_CH_RX_RECEIVE_CF。通过通道状态信息表,可以了解通道当前是发送还是接收数据,发送和接收的是什么类型的帧以及通道行为是申请缓冲Buffer还是发送数据抑或是在接收Confirmation。

如图2所示,本发明实施例发送数据(N_SDU)的步骤如下:

1、将所有Channel状态设置为CANTP_CH_IDLE。

2、发送数据时判断与N_SDU关联的Channel状态,如果不为CANTP_CH_IDLE,则返回错误;如果为CANTP_CH_IDLE,则看其是否有发送Buffer,如果没有的话则根据发送的是单帧还是多帧设定Channel状态为CANTP_CH_TX_BUFREQ_SF(单帧)或者CANTP_CH_TX_BUFREQ_FF(多帧)。获得Buffer以后则将状态修改为CANTP_CH_TX_TRANSMIT_SF(单帧)或者CANTP_CH_TX_TRANSMIT_FF(多帧);没有申请到Buffer则保持该状态,直到下一次申 请Buffer,重复这部分操作。数据发送以后将状态修改为CANTP_CH_TX_CONFIRM_SF(单帧)或者CANTP_CH_TX_CONFIRM_FF(多帧),否则返回错误,把Channel状态设置为CANTP_CH_IDLE。

如图3所示,本发明实施例发送数据(N_SDU)成功后,判断如果是单帧或者是多帧的最后一数据帧,则将Channel状态设置为CANTP_CH_IDLE,并向上层PduRouter传递Confirmation的信息;如果为多帧的非最后一个数据帧,会将N_SDU对应的Channel状态修改为CANTP_CH_TX_TRANSMIT_CF,用来发送下一个数据帧,在发送时如果需要申请Buffer,则将Channel状态修改为CANTP_CH_TX_BUFREQ_CF,在申请到Buffer的时候重新修改为CANTP_CH_TX_TRANSMIT_CF;如果是接收方FC_WT的Confirmation,则将Channel状态修改为CANTP_CH_RX_BUFREQ_CF;如果是接收方FC_OVFLW的Confirmation,则将Channel状态修改为CANTP_CH_IDLE;如果是接收方FC_CTS的Confirmation,将Channel状态修改为CANTP_CH_RX_RECEIVE_CF。

本发明中,对于通道状态(Channel状态)采用周期性执行函数进行定期处理更新。

如图4所示,取消数据发送请求时,将Channel的状态设置为CANTP_CH_IDLE。接收方接收数据以后,判断Channel的状态,如果是当前帧的第一帧的接收并且不为CANTP_CH_IDLE,则取消前一个数据的接收,转而接收新的数据帧。接收时,如果是接收方的数据帧接收,判断是否需要申请接收Buffer,并根据帧的类型设置状态为申请Buffer的状态(CANTP_CH_RX_BUFREQ_SF、CANTP_CH_RX_BUFREQ_FF或CANTP_CH_RX_BUFREQ_CF),申请到Buffer以后则拷贝数据,如果是最后一个帧,则将indication报告给上层;如果是FF,则修改Channel的状态为CANTP_CH_RX_TRANSMIT_FC_CTS,并发送FC_CTS,发送成功以后修改Channel的状态为CANTP_CH_RX_CONFIRM_FC_CTS;如果是CF,则修改Channel的状态位CANTP_CH_RX_RECEIVE_CF。如果没有申请到Buffer,根据返回值不同则将Channel的状态设置为CANTP_CH_RX_TRANSMIT_FC_WT(返回busy)或者CANTP_CH_RX_TRANSMIT_FC_OVFLW(返回overflow)。如果是接收方的Indication,根据接收的FC帧的类型来进行操作。如果接收的是FC_CTS,则设置Channel的状态为CANTP_CH_TX_TRANSMIT_CF;如果接收的是FC_OVFLW,则设置Channel的状态为CANTP_CH_IDLE。申请发送Buffer或者接收Buffer时,如果申请发送Buffer成功,则会根据申请Buffer以前的状态将Channel的状态设置为相应的发送状态(CANTP_CH_TX_TRANSMIT_SF、CANTP_CH_TX_TRANSMIT_FF或者CANTP_CH_TX_TRANSMIT_CF);如果申请接收方Buffer成功,则将Channel的状态修改为CANTP_CH_RX_BUFREQ_CF。如果申请失败,并且超过了申请的最大时限或者次数,则将Channel的状态重置为CANTP_CH_IDLE。其他情况不改变Channel的状态,等待下一次继续申请Buffer。

本发明实施例在发送和接收数据过程中,保证某一时刻Channel只能处于一个状态,这样在其他申请Buffer或者等待接收数据的时候可以通过Channel的状态来判断之前的状态和修改状态。这样通信过程的每个环节都可以由Channel的状态来帮助解决。

在HCS12X开发板上的实例如下所示,主要是在诊断通信管理模块(DCM)使用CanTp来发送单帧和多帧的实施过程。

1、单帧的发送流程

1)诊断通信管理模块(DCM)要发送一个单帧(SF),大小为6字节,CanTp层发送 数据时将Channel的状态修改为CANATP_CH_TX_BUFREQ_SF,同时申请发送Buffer,得到Buffer以后将Channel的状态修改为CANTP_CH_TX_TRANSMIT_SF,发送数据成功以后修改Channel的状态为CANTP_CH_TX_CONFIRM_SF。至此发送方处理过程结束。

2)接收方接收到发送方的数据以后,修改Channel的状态为CANTP_CH_RX_BUFREQ_SF,然后申请接收Buffer,申请成功以后则将Channel的状态重置为CANTP_CH_IDLE,然后拷贝数据,向上层报告数据接收成功。

2、多帧的发送流程

1)诊断通信管理模块(DCM)要发送一个多帧,大小为50字节。CanTp发送数据时将Channel的状态修改为CANATP_CH_TX_BUFREQ_FF,然后申请发送Buffer;得到Buffer以后将Channel的状态修改为CANTP_CH_TX_TRANSMIT_FF。发送成功以后修改Channel的状态为CANTP_CH_TX_CONFIRM_FF。

2)接收方接收到发送方的数据以后,修改Channel的状态为CANTP_CH_RX_BUFREQ_FF,然后申请接收Buffer,大小为20,申请成功以后拷贝数据,然后计算BlockSize的大小为2,修改Channel的状态为CANTP_CH_RX_TRANSMIT_FC_CTS,发送FC_CTS帧,此帧中包括BlockSize的大小等信息。发送以后修改状态为CANTP_CH_RX_CONFIRM_CF,发送成功以后将Channel的状态改为CANTP_CH_RX_RECEIVE_CF。

3)发送方接收到FC_CTS以后,会发送2大小个数据帧,期间如果发送Buffer使用完毕,则继续申请发送Buffer来发送数据。每次发送都是在前一个数据帧发送成功的Confirmation中来进行。发送完2个数据帧以后Channel的状态修改为CANTP_CH_TX_RECEIVE_FC,来等待接收方继续申请Buffer。期间的状态与步骤1)中的类似。

4)接收方接收到数据以后将数据拷贝到上层Buffer中,没有Buffer则会继续申请Buffer,然后计算BlockSize=3,给接收方发送FC_CTS。期间状态的修改与步骤2)中的相同。

5)发送方发送数据,最后一个数据帧发送成功以后则将Channel的状态修改为CANTP_CH_IDLE,并把数据发送成功报告给上层。

6)接收方接收到最后一个数据以后,设定Channel的状态为CANTP_CH_IDLE,拷贝数据,并将接收成功的信息报告给上层。

以上所述仅为本发明的优选实施方式,本发明的保护范围并不仅限于上述实施方式,凡是属于本发明原理的技术方案均属于本发明的保护范围。对于本领域的技术人员而言,在不脱离本发明的原理的前提下进行的若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

本文发布于:2024-09-25 12:20:52,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/86298.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议