在控制器功能开发测试过程中,部分测试场景需要对控制器发的报文进行E2E校验测试,以确认控制器E2E的功能是否正常,本文主要介绍如何通过VBA脚本实现E2E校验测试。
本文关键词:E2E, Counter,CRC8
概述
E2E是控制器发送报文使用的一种手段,来确保报文正常传输。以下用一个具体场景来介绍E2E校验测试的实现过程。例如,控制器APA发送的报文中有一条ID为0x191的报文,使用的E2E算法是Profile1,该报文对应的DataID是0x1234,0x191报文的信号排布方式如下。

该报文的DataID和前7个字节组成9个字节的数据,参与E2E信号的计算,具体计算规则为9个字节的数据传入CRC8算法,计算得到一个CRC值,即Checksum。除了要校验Checksum的正确性,还需要检验报文中Counter是否按照0-15的顺序依次递增(不同E2E算法,参与计算的报文字节或者DataID位置,Counter的范围有所不同)。
DEMO实现思路及代码展示
现在用VBA模拟另一个节点,对接收的0x191报文的E2E进行校验测试脚本的编写,大致思路是:先通过脚本函数获取总线上的0x191报文的数据场,从数据场中获取对应的Counter信号、Checksum信号的值,编写逻辑判断Counter信号的值是否递增,将DataID和前7个字节数据场组成的数据,带入CRC8算法中进行计算,并与Checksum信号作比较,判断过程中可以实时打印正确或失败的提示信息或者将提示信息写文件保存,以下是整体代码示例。
#coding=utf-8
'''
注释信息
'''
last_counter = None
current_counter = 0
current_checksum = 0
#onmsg可以是报文的ID或者是报文对象,ID范围字符串,ID列表,默认隐藏网段参数
@onMessage(0x191,CAN1)
def onMessageEvent (canMsg):
global last_counter
global current_counter
global current_checksum
# 获取时间戳
timestamp = canMsg.getTimestamp()
# 获取报文数据场
data = canMsg.getData()
# 获取counter信号值
current_counter = data[6] & 0x0F
# 获取checksum信号值
current_checksum = data[7]
# 判断counter信号值是否递增加1,且在0-15之间
if last_counter == None:
pass
else:
if (current_counter - last_counter == 1) or (last_counter == 15 and current_counter == 0):
pass
else:
writeErrorInfo("报文Counter的值没有按照0-15递增,Counter出现错误,上个counter的值为:%s,当前counter的值为:%s,时间点为%s" % (str(last_counter),str(current_counter),str(timestamp)))
last_counter = current_counter
# 判断checksum信号是否计算正确
dataid_data = [0x34,0x12]+ data[0:7]
cal_checksum = getCRCData(dataid_data, 8, 0x1D, False, 0x0, False, 0x0)
if cal_checksum == current_checksum:
pass
else:
writeErrorInfo("报文checksum的值计算错误,收到的值为:%s,计算得到的值为:%s,时间点为%s" % (str(current_checksum),str(cal_checksum),str(timestamp)))
关键接口说明
- @onMessage(id,network)
功能描述:接收到指定报文时会触发onMessage事件的执行。
参数描述:当有两个参数传入时,第一个参数是报文ID,第二个参数是网段信息。
示例中相关代码的含义为监控CAN1网段下的ID为0x191的报文,当监控到该报文时,可以通过canMsg.getData(),canMsg.getTimestamp()等接口获取报文数据或报文时间戳等信息。
- getCRCData(datas, width, poly, reflect_in, xor_in,reflect_out, xor_out)
功能描述:计算CRC校验值,返回一个整形数值。
参数描述: datas为需要校验的数据字节;width为算法的宽度;poly为多项式的值;reflect_in为初始字节翻转;xor_in为初始异或值;reflect_out为输出字节翻转; xor_out为输出异或值。
示例中相关代码的含义为将dataid和报文前7个字节组成的数据,按照CRC8算法计算出对应数据的CRC值。
结论
上文编写的脚本运行后,可以自动检测总线上相关报文的E2E信息是否正确,当识别控制器发出的报文中E2E信息不正确时会自动在控制台上进行提示。当然,我们也可以将上面的测试脚本写在TestModule模块中,以一条测试用例的形式存在,最终可以生成更完善的pdf或html格式的测试报告。