掌桥专利:专业的专利平台
掌桥专利
首页

生成代码的方法、装置、设备及存储介质

文献发布时间:2024-04-18 20:00:50


生成代码的方法、装置、设备及存储介质

技术领域

本申请实施例涉及通信技术领域,特别涉及一种生成代码的方法、装置、设备及存储介质。

背景技术

在需要进行数据通信和分布式控制的场景中,CAN(Controller Area Network,控制器局域网)作为一种串行通信协议得到了快速发展。例如,在车辆领域中,通过CAN实现车辆内的控制器、传感器和执行器等不同子系统之间的数据通信。DBC(Database CAN,数据库CAN)文件是用于描述CAN通信的信号、消息、数据长度、周期等信息的文件。因此,CAN通信过程中生成或识别报文的代码需要基于DBC文件生成。

相关技术中,需要用户人工对DBC文件进行分析,并根据分析结果人工生成CAN通信过程中的代码。由于需用户手动操作导致代码生成效率低下,而且容易因为用户的理解问题或注意力分散而导致代码生成错误。

发明内容

本申请实施例提供了一种生成代码的方法、装置、设备及存储介质,可用于解决相关技术中存在的问题,所述技术方案如下:

一方面,提供了一种生成代码的方法,所述方法包括:

读取数据库控制器局域网DBC文件中的多个报文分别对应的报文信息,所述多个报文中的任一报文用于传输至少一个信号,所述任一报文的报文信息包括所述至少一个信号的信号起始位和信号位宽;

基于所述任一报文对应的至少一个信号的信号起始位和信号位宽,获取所述任一报文的第一代码块,所述第一代码块包括所述至少一个信号分别对应的代码行,任一信号的代码行用于生成或识别所述任一报文中的所述任一信号。

另一方面,提供了一种生成代码的装置,所述装置包括:

读取模块,用于读取数据库控制器局域网DBC文件中的多个报文分别对应的报文信息,所述多个报文中的任一报文用于传输至少一个信号,所述任一报文的报文信息包括所述至少一个信号的信号起始位和信号位宽;

获取模块,用于基于所述任一报文对应的至少一个信号的信号起始位和信号位宽,获取所述任一报文的第一代码块,所述第一代码块包括所述至少一个信号分别对应的代码行,任一信号的代码行用于生成或识别所述任一报文中的所述任一信号。

另一方面,还提供了一种计算机设备,所述计算机设备包括处理器和存储器,所述存储器中存储有至少一条计算机程序,所述至少一条计算机程序由所述处理器加载并执行,以使所述计算机设备实现上述任一所述的生成代码的方法。

另一方面,还提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有至少一条计算机程序,所述至少一条计算机程序由处理器加载并执行,以使计算机实现上述任一所述的生成代码的方法。

另一方面,还提供了一种计算机程序产品或计算机程序,所述计算机程序产品或计算机程序包括计算机指令,所述计算机指令存储在计算机可读存储介质中。计算机设备的处理器从所述计算机可读存储介质读取所述计算机指令,处理器执行所述计算机指令,使得所述计算机设备执行上述任一所述的生成代码的方法。

本申请实施例提供的技术方案至少带来如下有益效果:

本申请实施例提供的技术方案,通过自动读取DBC文件实现了代码块的自动生成,代替用户的人工操作,提高了代码块的生成效率,并且可以避免人工失误,提高了生成的代码块的准确率。

附图说明

为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1是本申请实施例提供的一种实施环境的示意图;

图2是本申请实施例提供的一种生成代码的方法流程图;

图3是本申请实施例提供的一种获取报文信息的流程图;

图4是本申请实施例提供的另一种获取报文信息的流程图;

图5是本申请实施例提供的一种字节拼接流程图;

图6是本申请实施例提供的一种代码行排序流程图;

图7是本申请实施例提供的一种代码行合并流程图;

图8是本申请实施例提供的一种生成代码的装置的结构示意图;

图9是本申请实施例提供的一种服务器的结构示意图;

图10是本申请实施例提供的一种终端的结构示意图。

具体实施方式

为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。

需要说明的是,本申请的说明书中的术语“第一”、“第二”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示或描述的那些以外的顺序实施。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与本申请的一些方面相一致的装置和方法的例子。

随着通信技术的发展,数据库的更新迭代进程不断加快。由于数据库的更新迭代使得基于数据库生成的CAN通信过程中的代码需对应更新。相关技术中,需要用户手动对数据库文件进行分析,并将分析结果以代码块的形式注入或替换到控制器的相关代码块中。用户手动操作导致代码生成效率低下,而且容易因为用户的理解问题或注意力分散而导致代码错误。因此,亟需一种自动化和标准化的方法来基于数据库文件生成对应的控制器的代码。

本申请实施例提供了一种生成代码的方法,请参考图1,其示出了本申请实施例提供的一种生成代码的方法的实施环境示意图。该实施环境可以包括:计算机设备11。

其中,本申请实施例不对计算机设备11的产品形态进行限定。无论是哪种产品形态,该计算机设备11能够基于DBC文件生成对应的代码即可。例如,计算机设备11可以为终端,也可以为服务器。终端可以是任何一种可与用户通过键盘、触摸板、触摸屏、遥控器、语音交互或手写设备等一种或多种方式进行人机交互的电子产品,例如PC(PersonalComputer,个人计算机)、手机、智能手机、PDA(Personal Digital Assistant,个人数字助手)、可穿戴设备、PPC(Pocket PC,掌上电脑)、平板电脑、智能车机、智能电视、智能音箱等。服务器可以是一台服务器,也可以是由多台服务器组成的服务器集群,或者是一个云计算服务中心。可选地,计算机设备11可以为终端和服务器的组合,终端与服务器通过有线或无线网络建立通信连接。

本领域技术人员应能理解上述计算机设备11仅为举例,其他现有的或今后可能出现的计算机设备11如可适用于本申请,也应包含在本申请保护范围以内,并在此以引用方式包含于此。

参见图2,图2为本申请实施例提供的一种生成代码的方法流程图,该方法可以应用于图1所示的实施环境,例如,由图1所示的计算机设备11执行该方法。如图2所示,该方法包括但不限于如下步骤201和步骤202。

步骤201,读取DBC文件中的多个报文分别对应的报文信息,多个报文中的任一报文用于传输至少一个信号,任一报文的报文信息包括至少一个信号的信号起始位和信号位宽。

其中,DBC文件为CAN的数据库文件,CAN作为一种串行通信协议,定义了一种标准化的方式来让多个设备在同一个网络中互相通信和共享信息。本申请实施例不限定生成代码的应用场景,本申请实施例以该方法应用于车辆进行举例说明。

车辆的DBC文件是车辆电子系统的数据库文件,定义了车辆控制网络中的数据格式、消息ID、信号名称、信号长度、信号类型等信息,使得不同的控制器可以通过统一的数据格式进行通信,实现各种功能。例如,当车辆发生故障时,发动机控制模块可以向车载诊断仪发送故障码,车载诊断仪就可以根据接收到的故障码识别出故障原因。此外,DBC文件还可以用于调试和测试车辆控制系统,通过查看模块之间的通信数据,可以识别出存在的问题并进行对应修复。

本申请实施例中的DBC文件可以为电子/电气架构(Electrical/ElectronicArchitecture)输出的DBC文件。电子/电气架构涵盖了车上计算和控制系统的软硬件、传感器、通信网络、电气分配系统等,电子/电气架构通过特定的逻辑和规范将各个子系统有序结合起来,构成实现复杂功能的有机整体。在电子/电气架构中,DBC文件用于定义和控制各个电子控制单元(Electronic Control Unit,ECU)之间的通信,即CAN网络中的通信,确保数据的正确传输和解析。

在读取DBC文件之前需获取DBC文件地址,根据DBC文件地址读取DBC文件。本申请实施例不对获取DBC文件地址的方式进行限定。例如,通过计算机设备的外接硬件输入的内容,获取得到DBC文件地址信息,外接硬件可以是键盘或鼠标等。

DBC文件中包含了多个数据行,多个数据行包含了生成的代码所需的多个报文分别对应的报文信息,每个报文都有唯一的报文标识。对于每个报文,对应的报文信息包括了报文中每个信号的信号起始位和信号位宽,信号起始位指示在报文中的哪个位开始读取该信号的数据,信号位宽指示该信号占据多少个位。例如,如果某个报文的信息显示其包含一个信号,该信号的起始位为8,位宽为7,则该报文的第8位到第14位的内容指示该信号。

示例性的,报文信息中还包括报文标识,读取DBC文件中的多个报文分别对应的报文信息的过程可以包括,读取DBC文件中的多个报文标识,一个报文标识对应一个报文;再次读取DBC文件,在读取到多个报文标识中任一报文标识对应的匹配信息的情况下,确定第一关键字所在的第一数据行,第一关键字指示信号起始位和信号位宽,其中,匹配信息指示DBC文件中包括任一标识的数据行,基于第一数据行的内容获取任一报文标识对应的报文的信号起始位和信号位宽。

本申请实施例不对报文标识进行限定,能够区分不同的报文即可。例如,报文标识可以包括报文ID(identification,身份认证)和报文名称中的至少一个,其中,报文ID是一个唯一的标识符,用于在CAN网络上识别该报文,报文名称是一个描述性的字符串,在用于标识该报文的基础上,还用于表示该报文的功能或用途。

示例性的,读取DBC文件中的多个报文标识的过程可以包括,读取DBC文件中第二关键字所在的第二数据行,第二关键字指示报文标识,基于第二数据行的内容获取多个报文分别对应的报文标识。

在一种可能的实施方式中,以报文标识包括报文ID和报文名称为例,第二关键字能够指示报文ID和报文名称,在DBC文件的内容中确定第二关键字所在的第二数据行,第二关键字指示报文ID和报文名称,基于第二数据行的内容读取得到报文信息对应的报文ID和报文名称。

参见图3所示的一种获取报文信息的流程图,第二关键字包括关键字“BO_”、关键字“BA_”和关键字“CM_”逐行读取DBC文件的内容,判断DBC文件的数据行中是否存在关键字“BO_”,若不存在关键字“BO_”,则继续逐行读取DBC文件的内容,若读取到一数据行的内容存在关键字“BO_”,则判断该行数据行是否存在关键字“BA_”和关键字“CM_”,若存在关键字“BA_”和关键字“CM_”中的任意一个,则该行不是报文ID定义行。例如,若该数据行存在关键字“BO_”和关键字“BA_”则该数据行指示报文的属性定义,不包含报文ID和报文名称。若该数据行存在关键字“BO_”和关键字“CM_”。则该数据行为报文的注解,不包含报文ID和报文名称。

在DBC文件中的数据行中存在关键字“BO_”,不存在关键字“BA_”和关键字“CM_”的情况下,该数据行为报文ID定义行,该数据行包括报文ID和报文名称。基于存在报文ID和报文名称的数据行,获取报文ID和报文名称,一个报文对应一个报文ID,一个报文对应一个报文名称。示例性地,基于存在报文ID和报文名称的数据行,获取报文ID和报文名称的过程包括,判断该数据行内容的第七个字符是否为空格,若为空格,则获取DLC(Date LengthCode,数据长度代码)小于等于9的报文的报文ID和报文名称,若不为空格,则获取DLC大于9的报文的报文ID和报文名称,已DLC为9作为划分报文的依据仅为举例说明,在具体应用过程中可根据不同的需要进行设定,同样,第七个字符仅为一种指示DLC是否为9的判定方式,仅为举例说明,在具体应用过程中可根据不同的需要进行设定。

在本申请实施例中,报文信息还包括报文的收发模式和报文的DLC,在获取到报文ID和报文名称的情况下,检查关键字符获取报文的收发模式和报文的DLC。DLC用于表示报文中数据字段的长度,根据报文的DLC是否大于长度阈值来判断获取方式。例如,如图3所示,以关键字符为“:”,长度阈值为9为例,确定关键字符“:”在存在报文ID和报文名称的数据行中的位置,判断关键字符“:”后第三位是否为空格,若“:”后第三位不为空格,代表报文的DLC大于9,则按照第一获取方式获取报文信息;若“:”后第三位为空格,代表报文的DLC小于或等于9,则按照第二获取方式获取报文信息。

其中,第一获取方式可以为,根据“BO_”所在的数据行获取报文的收发模式、信号起始位和信号位宽等报文信息,第二获取方式可以为,根据除“BO_”所在的数据行之外的其他数据行获取报文的收发模式、信号起始位和信号位宽等报文信息。本申请实施例不对第一获取方式和第二获取方式的具体过程进行限定,可根据具体数据处理过程中的需求进行调整。

示例性的,DBC文件中存在关键字“BO_”且不存在关键字“BA_”和关键字“CM_”的数据行的内容为BO_201959408MSG1:8VCU_Vehicle_Control_Unit,其中,报文ID为“201959408”,报文名称为“MSG1”,关键字符为“:”报文的DLC为8字节,报文的发送者为VCU_Vehicle_Control_Unit。

可选地,可以基于多个报文的报文标识生成多个报文列表,一个报文列表对应一个报文,一个报文列表可以包括对应报文的报文名称和报文信息。例如,基于获取的报文ID和报文名称确定报文ID列表和报文名称列表,按照报文ID列表和报文名称列表依次在DBC文件的内容中确定指示信号起始位和信号位宽的第一关键字所在的第一数据行,基于第一数据行的内容获取报文的信号起始位和信号位宽,并将获取的信号起始位和信号位宽添加到对应的报文ID列表或报文名称列表中。可选的,报文信息还可以包括信号名称,信号名称用于标识不同信号,或者,描述报文中的信号的功能等。

参见图4所示的一种获取报文信息的流程图,在根据报文ID和报文名称对应生成报文ID列表和报文名称列表的情况下,逐行读取DBC文件的内容。在读取每一数据行时,确定报文ID列表和报文名称列表是否存在未处理的报文。如果存在未处理的报文,则使用未处理的报文对应的报文ID或报文名称作为匹配信息进行查询。本申请实施例不对匹配信息的格式进行限定,例如,匹配信息可以为BO_报文ID+空格+报文名称。

在查询到匹配信息的情况下,车辆程序确定该数据行包含了报文名称或报文ID对应的信号的信息。在查询到一个报文的匹配信息的情况下,对该报文的索引次数加1,并进行记录,表示处理了一个新的报文,以防止对同一个报文重复处理或遗漏报文。无论是查询到匹配信息还是未查询到匹配信息,根据第一关键字对应获取该报文ID或报文名称对应的至少一个信号的信号名称、信号起始位和信号位宽。示例性地,第一关键字可以包括“SG_”和“:”,即将“SG_”和“:”作为检索条件,在检索到“SG_”和“:”时,“SG_”和“:”对应的数据行的内容即对应信号名称、信号起始位和信号位宽。

可选地,每获取到一个信号,信号的索引也加1,并进行记录,并将获取到的信号名称、信号起始位和信号位宽的中间变量清零,以便处理下一个信号。在获取到信号名称、信号起始位和信号位宽后,或者,在未检索到“SG_”和“:”时,将获取的信号名称、信号起始位和信号位宽存储到报文ID列表和/或报文名称列表中。基于DBC文件获取报文信息的过程会重复进行,直到处理完最后一个报文。

步骤202,基于任一报文对应的至少一个信号的信号起始位和信号位宽,获取任一报文的第一代码块,第一代码块包括至少一个信号分别对应的代码行,任一信号的代码行用于生成或识别任一报文中的任一信号。

在获取到多个报文的报文信息的情况下,根据任一报文的报文信息,可以获取任一报文的第一代码块,进而能够获取多个报文分别对应的第一代码块。一个CAN网络中的一个模块存在至少一个第一代码块,该模块可通过至少一个第一代码块生成向其它模块发送的报文,从而实现两个或多个模块之间的互相通信。

示例性的,在获取多个报文分别对应的第一代码块的过程中,每生成一个报文的第一代码块,则将报文ID的索引次数加1,直至索引次数大于多个报文的总数量。在多个报文存储为报文ID列表的情况下,直至索引次数大于报文ID列表的长度,即已遍历全部报文。根据报文信息中的收发模式判断是报文是接收报文还是发送报文,根据不同的收发模式选定不同的处理方式。

可选地,当报文的收发模式指示为接收模式的情况下,报文即为接收报文,则输出标识^^RX^^到对应的代码块中,用以根据该标识确定后续的排序或合并步骤的处理方法,然后根据信号的位宽来决定如何处理信号所在的字节。终端设备能够通过获取到的位宽、字节号、位移量进行计算和拼接得到第一代码块,计算和拼接的过程可参见图5。

此外,在判断收发模式之前需对报文的类型进行判断,若报文的类型为诊断报文,由于诊断报文是用于网络故障排除和性能分析的数据格式,不是用于CAN通信的报文,因此,不对诊断报文进行第一代码块的生成。发送报文的处理逻辑与接收报文的处理逻辑类似,但在输出格式上存在差别。当收发模式指示为发送模式的情况下,流程就进入发送模式,输出一个不同的标识^^TX^^。

参见图5所示的一种字节拼接流程图,以多个报文为报文ID列表的方式为例,由于每生成一个报文的第一代码块索引次数就会加1,因此,以索引次数小于报文ID列表长度为循环条件,从而遍历所有的报文。对于每个报文,在确定报文ID不是诊断ID的情况下,即确定报文不为诊断报文,则进一步确定报文的收发模式是否为收,若为诊断报文,则索引次数加1。如果报文的收发模式为收,即该报文为接收报文,则逐个读取该报文ID下所有信号以及信号对应的起始位、位宽等信息,确定信号的索引次数j是否大于该报文包含的信号数,从而避免遗漏。

对于不同信号位宽的信号采用不同的处理方式,本申请实施例不对信号的信号位宽进行限定。示例性地,以一个字节包含8位为例,根据信号位宽可将信号分为位宽小于等于8的信号、位宽大于8小于等于16的信号和位宽大于16小于等于24的信号等。对于信号位宽小于等于8的信号,采用位宽小于等于8的处理方式、对于信号位宽大于8小于等于16的信号,采用位宽大于8小于等于16的处理方式等。

对于信号位宽大于16小于等于24的信号,该信号的信号位宽大于两个完整字节的位数,故该信号可能跨四个字节,对应可采用信号位宽大于16小于等于24且信号跨4字节的处理方式或信号位宽大于16小于等于24且信号非跨4字节的处理方式。本申请实施例对于不同信号的处理方式不做具体限定,可参考如下信号位宽小于等于8以及信号位宽大于8小于等于16的实施例举例。对于信号位宽大于16的信号处理方式可参考如下举例内容,此处不再赘述。

若收发模式为发,即该报文为发送报文,逐个读取该报文ID下所有信号以及信号对应的起始位、位宽等信息,确定信号的索引次数j是否大于该报文包含的信号数,从而避免遗漏。

对于不同信号位宽的信号采用不同的处理方式,以一个字节包含8位为例,根据信号位宽可将信号分为,位宽小于等于8的信号和位宽大于8小于等于16的信号等,本申请实施例不对信号的信号位宽进行限定。对于信号位宽小于等于8的信号,采用位宽小于等于8的处理方式、对于信号位宽大于8小于等于16的信号,采用位宽大于8小于等于16的处理方式等。发送报文的信号的处理方式可参见接收报文的信号的处理方式,此处不再赘述。

示例性地,若输出^^RX^^到输出的文件中,表示该报文为接收报文,根据信号的不同位宽采用不同的信号处理方式生成代码行,包括但不限于如下几种情况。

情况一,一个字节包括8位,信号位宽小于等于8。

在该情况一下,信号处理方式可以为根据信号起始位计算出该信号的字节号和偏移量,字节号等于信号起始位除以8的整数部分,偏移量等于起始位加1减去该字节的bit(比特)0位号再减去信号位宽。进而,输出相应的代码行,将该信号的值从相应的字节中提取出来。可输出为如下该信号对应的代码行,TCU_U.{signal}raw=(uint8)(byte[{bytenum1}]>>{offset})&{bitwidth1}。

其中,“TCU_U.{signal}raw”表示一个结构体“TCU_U”中的一个成员变量“{signal}raw”,“{signal}”是一个占位符,可替换为具体的信号名称。“byte[{bytenum1}]”表示从名为“byte”(字节)的数组中取出索引为“{bytenum1}”的元素,即字节号位1,其中“{bytenum1}”是一个占位符,需要替换为具体的字节索引。“>>{offset}”是一个右移位运算符,将“byte[{bytenum1}]”中的二进制位向右移动“{offset}”位,其中“{offset}”是一个占位符,需要替换为具体的偏移量。

其中,“&{bitwidth1}”使用了一个AND(且)运算符“&”,将右移后的结果与“{bitwidth1}”进行按位与运算,其中“{bitwidth1}”是一个占位符,需要替换为具体的位宽度。从而将高位清零,只保留低位的值。“(uint8)(...)”是一个类型转换,将上述运算的结果转换为“uint8”(单元8)类型。该代码行用于是从名为“byte”的数组中取出索引为“{bytenum1}”的元素,将该元素右移“{offset}”位,然后将该代码行中的高位清零,只保留低位的值,最后将该代行码转换为“uint8”类型并赋值给“TCU_U.{signal}raw”变量,从而输出代码行。

情况二,一个字节包括8位,信号位宽大于8小于等于16。

在该情况二下,上述“bytenum1”指示字节号1,即拼接的字节是0到64的哪一个字节。“bytenum2”指示字节号2,等于字节号1加1。“bytewidth1”指该信号跨两个字节,为第一个字节包含的宽度,等于起始位加1减“bytebit0”。“bytewidth1”等于“width”(信号位宽)减“bytewidth1”(字节宽度1)。“offset”(第二个字节的位移,第一个字节的位移就是“bytewidth2”)等于8减“bytewidth2”。可输出如下该信号对应的代码行,

"TCU_U.{signal}raw=(uint16)(byte[{bytenum1}]&{bytewidth1})<<{byteoffset1}|(uint16)(byte[{bytenum2}]<<{byteoffset2})&{bytewidth2}"。

对于发送报文,输出^^TX^^到输出的文件中,表示该报文为发送报文,使用类似接收报文对应的计算方法,将信号的值拆分到相应的字节中,并输出相应的代码行,例如代码行可以是:

byte[{bytenum1}]=(uint8)(TCU_Y.{signal}raw>>{byteoffset1})&{bytewidth1}; byte[{bytenum2}]=(uint8)(TCU_Y.{signal}raw>>{byteoffset2})&{bytewidth2}。

示例性地,存在一个接收报文,报文ID为0x123,该报文包含一个名为MySignal的信号,信号起始位为8,信号位宽为12,bit0位号为0,接收对象为0xFFF。由此,可得出,字节号为8/8=1,偏移量为8+1-0-12=-3。因此,对应的代码行可以为:TCU_U.MySignalraw=(uint8)(byte[1]>>3)&0xFFF。在本申请实施例中,代码行也简称为代码。

以上为直接基于任一报文对应的至少一个信号的信号起始位和信号位宽,获取任一报文的第一代码块的实施过程。可选地,对于上述直接基于任一报文对应的至少一个信号的信号起始位和信号位宽,获取的任一报文的第一代码块可以称为第二代码块;如果第二代码块为发送代码块,可以后对第二代码块进行优化处理,例如,排除处理或者合并处理中的至少一个,将优化处理后的第二代码块最为最终的任一报文的第一代码块;如果第二代码块为接收代码块,则直接将该第二代码块为最终的任一报文的第一代码块。

在一种可能的实施方式中,任一信号的代码行指示任一信号对应的字节号。基于任一报文对应的至少一个信号的信号起始位和信号位宽,获取任一报文的第一代码块的过程包括,基于任一报文对应的至少一个信号的信号起始位和信号位宽,获取任一报文的第二代码块,在第二代码块为发送代码块的情况下,按照至少一个信号的字节号的大小顺序对第二代码块中的代码行进行排序,得到任一报文的第三代码块,将第三代码块中相同字节号的代码行合并为同一代码行,得到任一报文的第一代码块。

其中,基于任一报文对应的至少一个信号的信号起始位和信号位宽,获取任一报文的第二代码块的过程可参见步骤202中情况一和情况二的相关描述,此处不再赘述。可选的,根据信号的字节号对报文中的信号对应的代码行进行排序和合并的过程可为先排序后合并,也可为先合并后排序,或者排序进程和合并进程同时进行,本申请实施例对此不做限定,可根据数据处理过程中的需求选择对应的处理方式。其中,可以通过报文信息中的收发模式确定第二代码块是发送代码块还是接收代码块,即收发模式为收的报文生成的第二代码块为发送代码,收发模式为发的报文生成的第二代码块为接收代码块。

示例性地,排序的过程可以为,逐行读取第二代码块,并将每行代码行存储在列表或其他形式的变量中。该列表可能包含了多个报文ID的数据。查找读取的数据中是否包含“^^TX^^”。如果包含“^^TX^^”,则进行中间变量的初始化,将第一代码块的索引次数i设置为0,并设置flag=1,表示该第一代码块需要进行排序,flag=1表明该报文为发送报文。如果读到的数据中包含“^^RX^^”,那么将flag设置为0,意味着不需要进行排序。对需排序的内容进行排序处理。确保报文在传输或处理时按照正确的顺序进行,正确的顺序能确保数据的完整性和准确性。

参见图6所示的一种代码行排序流程图,逐行读取第二代码块,并将读到的每个代码行存储在列表中。先判断是否读取完成第二代码块中的所有代码行,如果读取完成第二代码块中的所有代码行,则结束排序流程。如果未读取完成第二代码块中的所有代码行,则逐行读取第二代码块中的代码行。对于读取的任一代码行,如果任一代码行中有“^^TX^^”,则进行中间变量的初始化,即清空字节列表,将第二代码块的索引次数i设置为0,并将flag设置为1,表示需要进行排序;如果任一代码行中是“^^RX^^”,则将flag设置为0,表示不需要进行排序。

接下来,以存在关键字“byte”并且flag=1作为进行排序的触发条件,若不存在关键字“byte”,或者flag=0,则不进行排序,其中“byte”能够指示对应的代码行存在字节号,若不存在字节号则无法进行排序。其中,排序算法可为冒泡排序,本申请实施例不对排序算法进行限定。

示例性的,该第二代码块中的至少一个信号通过1、2、3…的序号进行标记,使用该第二代码块中的序号最大值作为循环条件,循环次数不超过该序号最大值,从而遍历第二代码块中的全部信号对应的代码行。每读取到第二代码块中包括的字节号,则暂存在字节列表中;判断字节列表中有无小于当前读取的字节号,将字节号按大小顺序重新在字节列表中排列。按照排列后的字节列表获取排序后的第三代码块,第三代码块中每个代码行的字节号是按照大小顺序排列的。其中,大小顺序可以是从大到小,也可以是从小到大。此外,得到第三代码块之后,针对该代码块的索引次数i加一表明该代码块已排序,将第三代码块作为代码输出。

在第二代码块为接收代码块的情况下,保持该第二代码块中代码行的顺序不变,将该第二代码块作为代码输出。

示例性地,以待合并的代码包括两个报文分别对应的代码块为例,两个报文分别对应的代码块分别为第三代码块和第二代码块,其中,第三代码块为发送代码块,即排序后的第二代码块,第二代码块为接收代码块,即未排序的第二代码块。代码行合并过程可以包括,逐行读取第二代码块和第三代码块,查找读取的代码行中是否存在“^^TX^^”,如果代码行中存在“^^TX^^”,则确定该代码块为发送代码块,进行中间变量的初始化,将第三代码块的索引次数i设置为0,并将flag设置为1,表明需要进行合并处理。如果读取的代码行中存在“^^RX^^”,则确定该代码块为接收代码块,将flag设置为0,表明不需要进行合并处理。

通过对发送报文对应的的字节进行合并和整理,以确保最终输出的代码块中,相同字节号的代码行被合并为一个,并且按照正确的顺序排列,从而方便后续的操作,比如数据传输、存储或分析。同时,通过合并相同字节号的代码行,有助于减少代码冗余,提高数据处理的效率。其中,对于代码行合并结束后,代码行的索引次数j加一,根据代码行的索引次数确定是否遍历所有代码行。

参见图7所示的一种代码行合并流程图,逐行读取第二代码块和第三代码块,并将读取到的每个代码行存储在列表中。先判断是否读取完成列表中的所有代码行,如果读取完成列表中的所有代码行,则结束排序流程。如果未读取完成列表中的所有代码行,则逐行读取列表中的代码行。对于读取的任一代码行,如果任一代码行中存在“^^TX^^”,对应第三代码块,则进行中间变量的初始化,即清空字节列表,将第三代码块的索引次数i设置为0,并将flag设置为1,表示需要进行合并;如果任一代码行中是“^^RX^^”,对应第二代码块,则将flag设置为0,表示不需要进行合并。

接下来,以存在关键字“byte”并且flag=1作为进行合并的触发条件,若不存在关键字“byte”,或者flag=0,则不进行合并,其中“byte”能够指示对应的代码行存在字节号,若不存在字节号则无法进行合并。

示例性地,该第三代码块中的至少一个信号通过1、2、3…的序号进行标记,使用该第三代码块中的代码行的序号最大值作为循环条件,即代码行的索引次数不超过代码行总数,循环次数不超过该序号最大值,从而遍历第三代码块中的全部信号对应的代码行。在合并处理中,每读取到第三代码块中包括的字节号,则暂存在字节列表中,以每个信号的字节号作为替换条件,当替换条件满足时,即字节列表中存储的上一个字节号与当前相同,合并两行的内容,并删除原有的两行的内容,使用合并的内容代替,即将字节号相同的信号对应的代码行进行合并,获得替换数据。删除保存读取数据的列表中原有相同字节号的代码行,再将替换数据存储到原有相同字节号的代码行的位置。

重复以上步骤,直至处理完最后一个报文ID对应的最后一个信号,按照合并后的字节列表获取合并后的第一代码块,第一代码块中不存在字节号相同的信号。其中,每处理一个代码行,代码行索引次数加1,直至代码行索引次数大于代码行数,即读取完所有代码行,可选地,若存在两代码行合并,则代码行索引次数和代码行总数减1。此外,得到第一代码块之后,针对该代码块的索引次数i加一表明该代码块已合并。

例如,如果读取到信号里有两行代码行都是“byte[0]=0x12”,则将两行代码行合并成一行“byte[0]=0x12,0x12”。然后,删除原来保存读取数据的列表里的数据,把替换数据存储到原代码行所在的位置。

示例性地,顺序不变的第二代码块为接收代码块,保持该第二代码块中代码行内容不变,将第一代码块和内容不变的第二代码块作为代码输出。

在一种可能的实施方式中,任一信号的代码行指示任一信号对应的字节号。基于任一报文对应的至少一个信号的信号起始位和信号位宽,获取任一报文的第一代码块的过程包括,基于任一报文对应的至少一个信号的信号起始位和信号位宽,获取任一报文的第二代码块,在第二代码块为发送代码块的情况下,按照至少一个信号的字节号的大小顺序对第二代码块中的代码行进行排序,得到任一报文的第一代码块。其中,得到第二代码块的过程可参考步骤202中情况一或情况二的相关描述,得到任一报文的第一代码块的过程可参考基于上述排序过程得到第三代码块的相关描述,此处不再赘述。

在一种可能的实施方式中,任一信号的代码行指示任一信号对应的字节号。基于任一报文对应的至少一个信号的信号起始位和信号位宽,获取任一报文的第一代码块的过程包括,基于任一报文对应的至少一个信号的信号起始位和信号位宽,获取任一报文的第二代码块,在第二代码块为发送代码块的情况下,将第二代码块中相同字节号的代码行合并为同一代码行,得到任一报文的第一代码块。其中,得到第二代码块的过程可参考步骤202中情况一或情况二的相关描述,得到任一报文的第一代码块的过程可参考基于上述合并过程得到第一代码块的相关描述,此处不再赘述。

综上,本申请实施例提供的生成代码的方法,通过自动读取DBC文件实现了代码块的自动生成,代替用户的人工操作,提高了代码块的生成效率,并且可以避免人工失误,提高了生成的代码块的准确率。

参见图8,本申请实施例提供了一种生成代码的装置,该装置包括:

读取模块801,用于读取DBC文件中的多个报文分别对应的报文信息,多个报文中的任一报文用于传输至少一个信号,任一报文的报文信息包括至少一个信号的信号起始位和信号位宽;

获取模块802,用于基于任一报文对应的至少一个信号的信号起始位和信号位宽,获取任一报文的第一代码块,第一代码块包括至少一个信号分别对应的代码行,任一信号的代码行用于生成或识别任一报文中的任一信号。

在一种可能的实现方式中,报文信息还包括报文标识,读取模块801,用于读取DBC文件中的多个报文标识,一个报文标识对应一个报文;再次读取DBC文件,在读取到多个报文标识中任一报文标识对应的匹配信息的情况下,确定第一关键字所在的第一数据行,第一关键字指示信号起始位和信号位宽,匹配信息指示DBC文件中包括任一报文标识的数据行;基于第一数据行的内容获取任一报文标识对应的报文的信号起始位和信号位宽。

在一种可能的实现方式中,读取模块801,用于读取DBC文件中第二关键字所在的第二数据行,第二关键字指示报文标识;基于第二数据行的内容获取多个报文标识。

在一种可能的实现方式中,任一信号的代码行指示任一信号对应的字节号,获取模块802,用于基于任一报文对应的至少一个信号的信号起始位和信号位宽,获取任一报文的第二代码块;在第二代码块为发送代码块的情况下,按照至少一个信号的字节号的大小顺序对第二代码块中的代码行进行排序,得到任一报文的第一代码块。

在一种可能的实现方式中,任一信号的代码行指示任一信号对应的字节号,获取模块802,用于基于任一报文对应的至少一个信号的信号起始位和信号位宽,获取任一报文的第二代码块;在第二代码块为发送代码块的情况下,将第二代码块中相同字节号的代码行合并为同一代码行,得到任一报文的第一代码块。

在一种可能的实现方式中,任一信号的代码行指示任一信号对应的字节号,获取模块802,用于基于任一报文对应的至少一个信号的信号起始位和信号位宽,获取任一报文的第二代码块;在第二代码块为发送代码块的情况下,按照至少一个信号的字节号的大小顺序对第二代码块中的代码行进行排序,得到任一报文的第三代码块;将第三代码块中相同字节号的代码行合并为同一代码行,得到任一报文的第一代码块。

综上,本申请实施例提供的生成代码的装置,自动解析DBC文件并生成代码块,代码块用于CAN通信过程中报文的生成或识别,自动解析代替了用户的手动操作,提高了代码块的生成效率,提高了代码块的准确率。

需要说明的是,上述实施例提供的生成代码的装置在实现其功能时,仅以上述各功能模块的划分进行举例说明,实际功能中,可以根据需要而将上述功能分配由不同的功能模块完成,即将设备的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的装置与方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。

图9是本申请实施例提供的一种服务器的结构示意图,该服务器可因配置或性能不同而产生比较大的差异,可以包括一个或多个处理器1101和一个或多个存储器1102,其中,该一个或多个存储器1102中存储有至少一条计算机程序,该至少一条计算机程序由该一个或多个处理器1101加载并执行,以使该服务器实现上述各个方法实施例提供的生成代码的方法。当然,该服务器还可以具有有线或无线网络接口、键盘以及输入输出接口等部件,以便进行输入输出,该服务器还可以包括其他用于实现设备功能的部件,在此不做赘述。

图10是本申请实施例提供的一种终端的结构示意图。该终端例如可以是:车载终端、智能手机、平板电脑、播放器、笔记本电脑或台式电脑。终端还可能被称为用户设备、便携式终端、膝上型终端、台式终端等其他名称。

通常,终端包括有:处理器1501和存储器1502。

处理器1501可以包括一个或多个处理核心,比如4核心处理器、8核心处理器等。处理器1501可以采用DSP(Digital Signal Processing,数字信号处理)、FPGA(Field-Programmable Gate Array,现场可编程门阵列)、PLA(Programmable Logic Array,可编程逻辑阵列)中的至少一种硬件形式来实现。处理器1501也可以包括主处理器和协处理器,主处理器是用于对在唤醒状态下的数据进行处理的处理器,也称CPU(Central ProcessingUnit,中央处理器);协处理器是用于对在待机状态下的数据进行处理的低功耗处理器。在一些实施例中,处理器1501可以集成有GPU(Graphics Processing Unit,图像处理器),GPU用于负责显示屏所需要显示的内容的渲染和绘制。一些实施例中,处理器1501还可以包括AI(Artificial Intelligence,人工智能)处理器,该AI处理器用于处理有关机器学习的计算操作。

存储器1502可以包括一个或多个计算机可读存储介质,该计算机可读存储介质可以是非暂态的。存储器1502还可包括高速随机存取存储器,以及非易失性存储器,比如一个或多个磁盘存储设备、闪存存储设备。在一些实施例中,存储器1502中的非暂态的计算机可读存储介质用于存储至少一个指令,该至少一个指令用于被处理器1501所执行,以使该终端实现本申请中方法实施例提供的生成代码的方法。

在一些实施例中,终端还可选包括有:外围设备接口1503和至少一个外围设备。处理器1501、存储器1502和外围设备接口1503之间可以通过总线或信号线相连。各个外围设备可以通过总线、信号线或电路板与外围设备接口1503相连。具体地,外围设备包括:射频电路1504、显示屏1505、摄像头组件1506、音频电路1507和电源1508中的至少一种。

外围设备接口1503可被用于将I/O(Input/Output,输入/输出)相关的至少一个外围设备连接到处理器1501和存储器1502。在一些实施例中,处理器1501、存储器1502和外围设备接口1503被集成在同一芯片或电路板上;在一些其他实施例中,处理器1501、存储器1502和外围设备接口1503中的任意一个或两个可以在单独的芯片或电路板上实现,本实施例对此不加以限定。

射频电路1504用于接收和发射RF(Radio Frequency,射频)信号,也称电磁信号。射频电路1504通过电磁信号与通信网络以及其他通信设备进行通信。射频电路1504将电信号转换为电磁信号进行发送,或者,将接收到的电磁信号转换为电信号。可选地,射频电路1504包括:天线系统、RF收发器、一个或多个放大器、调谐器、振荡器、数字信号处理器、编解码芯片组、用户身份模块卡等等。射频电路1504可以通过至少一种无线通信协议来与其它终端进行通信。该无线通信协议包括但不限于:城域网、各代移动通信网络(2G、3G、4G及5G)、无线局域网和/或WiFi(Wireless Fidelity,无线保真)网络。在一些实施例中,射频电路1504还可以包括NFC(Near Field Communication,近距离无线通信)有关的电路,本申请对此不加以限定。

显示屏1505用于显示UI(User Interface,用户界面)。该UI可以包括图形、文本、图标、视频及其它们的任意组合。当显示屏1505是触摸显示屏时,显示屏1505还具有采集在显示屏1505的表面或表面上方的触摸信号的能力。该触摸信号可以作为控制信号输入至处理器1501进行处理。此时,显示屏1505还可以用于提供虚拟按钮和/或虚拟键盘,也称软按钮和/或软键盘。在一些实施例中,显示屏1505可以为一个,设置在终端的前面板;在另一些实施例中,显示屏1505可以为至少两个,分别设置在终端的不同表面或呈折叠设计;在另一些实施例中,显示屏1505可以是柔性显示屏,设置在终端的弯曲表面上或折叠面上。甚至,显示屏1505还可以设置成非矩形的不规则图形,也即异形屏。显示屏1505可以采用LCD(Liquid Crystal Display,液晶显示屏)、OLED(Organic Light-Emitting Diode,有机发光二极管)等材质制备。

摄像头组件1506用于采集图像或视频。可选地,摄像头组件1506包括前置摄像头和后置摄像头。通常,前置摄像头设置在终端的前面板,后置摄像头设置在终端的背面。在一些实施例中,后置摄像头为至少两个,分别为主摄像头、景深摄像头、广角摄像头、长焦摄像头中的任意一种,以实现主摄像头和景深摄像头融合实现背景虚化功能、主摄像头和广角摄像头融合实现全景拍摄以及VR(Virtual Reality,虚拟现实)拍摄功能或者其它融合拍摄功能。在一些实施例中,摄像头组件1506还可以包括闪光灯。闪光灯可以是单色温闪光灯,也可以是双色温闪光灯。双色温闪光灯是指暖光闪光灯和冷光闪光灯的组合,可以用于不同色温下的光线补偿。

音频电路1507可以包括麦克风和扬声器。麦克风用于采集用户及环境的声波,并将声波转换为电信号输入至处理器1501进行处理,或者输入至射频电路1504以实现语音通信。出于立体声采集或降噪的目的,麦克风可以为多个,分别设置在终端的不同部位。麦克风还可以是阵列麦克风或全向采集型麦克风。扬声器则用于将来自处理器1501或射频电路1504的电信号转换为声波。扬声器可以是传统的薄膜扬声器,也可以是压电陶瓷扬声器。当扬声器是压电陶瓷扬声器时,不仅可以将电信号转换为人类可听见的声波,也可以将电信号转换为人类听不见的声波以进行测距等用途。在一些实施例中,音频电路1507还可以包括耳机插孔。

电源1508用于为终端中的各个组件进行供电。电源1508可以是交流电、直流电、一次性电池或可充电电池。当电源1508包括可充电电池时,该可充电电池可以支持有线充电或无线充电。该可充电电池还可以用于支持快充技术。

在一些实施例中,终端还包括有一个或多个传感器1509。该一个或多个传感器1509包括但不限于:加速度传感器1510、陀螺仪传感器1511、压力传感器1512、光学传感器1513以及接近传感器1514。

加速度传感器1510可以检测以终端建立的坐标系的三个坐标轴上的加速度大小。比如,加速度传感器1510可以用于检测重力加速度在三个坐标轴上的分量。处理器1501可以根据加速度传感器1510采集的重力加速度信号,控制显示屏1505以横向视图或纵向视图进行用户界面的显示。加速度传感器1510还可以用于游戏或者用户的运动数据的采集。

陀螺仪传感器1511可以检测终端的机体方向及转动角度,陀螺仪传感器1511可以与加速度传感器1510协同采集用户对终端的3D动作。处理器1501根据陀螺仪传感器1511采集的数据,可以实现如下功能:动作感应(比如根据用户的倾斜操作来改变UI)、拍摄时的图像稳定、游戏控制以及惯性导航。

压力传感器1512可以设置在终端的侧边框和/或显示屏1505的下层。当压力传感器1512设置在终端的侧边框时,可以检测用户对终端的握持信号,由处理器1501根据压力传感器1512采集的握持信号进行左右手识别或快捷操作。当压力传感器1512设置在显示屏1505的下层时,由处理器1501根据用户对显示屏1505的压力操作,实现对UI界面上的可操作性控件进行控制。可操作性控件包括按钮控件、滚动条控件、图标控件、菜单控件中的至少一种。

光学传感器1513用于采集环境光强度。在一个实施例中,处理器1501可以根据光学传感器1513采集的环境光强度,控制显示屏1505的显示亮度。具体地,当环境光强度较高时,调高显示屏1505的显示亮度;当环境光强度较低时,调低显示屏1505的显示亮度。在另一个实施例中,处理器1501还可以根据光学传感器1513采集的环境光强度,动态调整摄像头组件1506的拍摄参数。

接近传感器1514,也称距离传感器,通常设置在终端的前面板。接近传感器1514用于采集用户与终端的正面之间的距离。在一个实施例中,当接近传感器1514检测到用户与终端的正面之间的距离逐渐变小时,由处理器1501控制显示屏1505从亮屏状态切换为息屏状态;当接近传感器1514检测到用户与终端的正面之间的距离逐渐变大时,由处理器1501控制显示屏1505从息屏状态切换为亮屏状态。

本领域技术人员可以理解,图10中示出的结构并不构成对终端的限定,可以包括比图示更多或更少的组件,或者组合某些组件,或者采用不同的组件布置。

在示例性实施例中,还提供了一种计算机设备,该计算机设备包括处理器和存储器,该存储器中存储有至少一条计算机程序。该至少一条计算机程序由一个或者一个以上处理器加载并执行,以使该计算机设备实现上述任一种生成代码的方法。

在示例性实施例中,还提供了一种计算机可读存储介质,该计算机可读存储介质中存储有至少一条计算机程序,该至少一条计算机程序由计算机设备的处理器加载并执行,以使计算机实现上述任一种生成代码的方法。

在一种可能实现方式中,上述计算机可读存储介质可以是只读存储器(Read-OnlyMemory,ROM)、随机存取存储器(Random Access Memory,RAM)、只读光盘(Compact DiscRead-Only Memory,CD-ROM)、磁带、软盘和光数据存储设备等。

在示例性实施例中,还提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述任一种生成代码的方法。

需要说明的是,本申请所涉及的信息(包括但不限于用户设备信息、用户个人信息等)、数据(包括但不限于用于分析的数据、存储的数据、展示的数据等)以及信号,均为经用户授权或者经过各方充分授权的,且相关数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准。例如,本申请中涉及到的DBC文件的相关信息都是在充分授权的情况下获取的。

应当理解的是,在本文中提及的“多个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。

以上所述仅为本申请的示例性实施例,并不用以限制本申请,凡在本申请的原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

技术分类

06120116541560