外设测试 - CAN 接口测试

原理

底层:Linux 内核 SocketCAN 子系统。

应用层:使用 canutils 工具。

同一板卡 2 个 CAN 配对测试

  • 使用两根导线,H 对 H、L 对 L 相连。

  • 使用 canutils 中的 canconfig 程序配置波特率,启动。

  • 使用 canutils 中的 candump 接收,cansend 发送。

  • 校验收发的数据是否一致。

 

1 个 CAN 与辅助板的 CAN 对接测试

参考前述测试。

1 个 CAN 与 PC 通过 USB-CAN 转换器与 PC 对接测试

  • 初始化后,板卡运行 canecho

  • CAN 接口通过 CAN-USB 转换模块与 PC 对接

  • PC 运行 CAN 调试程序,发送数据到板卡,然后接收返回的数据,确认数据无误。

1 个 CAN 与同一板卡的 RS232 对接测试

参考

内核官方 SocketCAN 文档: https://www.kernel.org/doc/html/v4.17/networking/can.html

canutils 介绍: https://blog.csdn.net/engrossment/article/details/105222753

参考代码

#!/usr/bin/env python
# Description:
#   Read write with can0 and can1 pair.
#   Usage: ./can_pair_test.py

import os
import sys
import time

def run_cmd(cmd):
    ret = os.system(cmd)
    exit_code = os.WEXITSTATUS(ret)
    if (exit_code != 0):
        sys.exit(exit_code)

# configure
run_cmd('canconfig can0 stop')
run_cmd('canconfig can0 bitrate 125000')
run_cmd('canconfig can0 start')
run_cmd('canconfig can1 stop')
run_cmd('canconfig can1 bitrate 125000')
run_cmd('canconfig can1 start')

SEND_DATA = '0x12 0x00 0x11 0x22 0x44 0x88 0x55 0xaa 0xff'
SEND_COUNT = 20

# can0 -> can1
can0_to_can1_file = './can0to1data.txt'#/tmp/can0to1data.txt
if (os.path.exists(can0_to_can1_file)):
    os.remove(can0_to_can1_file)

run_cmd('candump can1 -o can0to1data.txt &')
time.sleep(0.1)

cmd = 'cansend can0 --identifier=' + SEND_DATA + ' > /dev/null'
for i in range(SEND_COUNT):
	run_cmd(cmd)

run_cmd('sync')
run_cmd('killall -9 candump')

# can1 -> can0
can1_to_can0_file = './can1to0data.txt' #/tmp/can1to0data.txt
if (os.path.exists(can1_to_can0_file)):
    os.remove(can1_to_can0_file)

run_cmd('candump can0 -o can1to0data.txt &')
time.sleep(0.1)

cmd = 'cansend can1 --identifier=' + SEND_DATA + ' > /dev/null'
for i in range(SEND_COUNT):
	run_cmd(cmd)

run_cmd('sync')
run_cmd('killall -9 candump')

# Check files
def check_file_line_by_line(file_path, line_data):
    with open(can0_to_can1_file, "r") as f:
        for i in range(SEND_COUNT):
            line = f.readline().rstrip()
            if (line_data != line):
                print('Data not match: ' + line)
                print('Should be: ' + line_data)
                print('Test failed!')
                sys.exit(3)

LINE_DATA = '<0x012> [8] 00 11 22 44 88 55 aa ff'
check_file_line_by_line(can0_to_can1_file, LINE_DATA)
check_file_line_by_line(can1_to_can0_file, LINE_DATA)

print('Test pass!')
sys.exit(0)

2020年10月16日

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页