python-can-isotp库接收流控制帧后无法发送连续帧的问题求助
python-can-isotp库接收流控制帧后无法发送连续帧的问题求助
大家好,我目前遇到了一个CAN ISO-TP通信的问题,想请教下各位开发者。先说明下我的环境:
- Python 3.13.1
- can-isotp 2.0.6
- python-can 4.5.0
- 硬件使用Robotell的USB-CAN适配器
我编写了一个发送ISO-TP数据的函数,代码如下:
def send_msg(data): channel = find_Robotell_port() paramsdata = load_setup("setup.json") bus = can.interface.Bus(interface='robotell', channel=channel, bitrate=500000) data_byte = bytes([int(x,16) for x in data]) addr = isotp.Address(isotp.AddressingMode.Normal_11bits, rxid=0x62C, txid=0x6AC) params = paramsdata["Parameters"] stack = isotp.CanStack(bus, address=addr, error_handler=my_error_handler, params=params) try: stack.start() stack.send(data = data_byte, send_timeout= 5) except isotp.BlockingSendFailure: print('failure to send') finally: stack.stop() bus.shutdown()
(注:代码里的Print我改成了小写print,应该是笔误)
我的setup.json中配置的ISO-TP参数如下:
"Parameters": { "stmin" : 10, "blocksize" : 0, "tx_data_length" : 8, "tx_data_min_length" : 8, "override_receiver_stmin" :1000, "rx_flowcontrol_timeout" : 10000, "rx_consecutive_frame_timeout" : 1000, "tx_padding": 255, "wftmax" : 0, "max_frame_size" : 4095, "can_fd" : false, "bitrate_switch" : false, "default_target_address_type": 0, "rate_limit_enable" : false, "rate_limit_max_bitrate" : 10000000, "rate_limit_window_size" : 0.2, "listen_mode" : false, "blocking_send" :true, "logger_name" : "CAN_TP" }
现在遇到的问题是:当发送8字节以下的单帧数据时,整个流程完全正常;但一旦发送超过8字节的多帧数据,就会出现异常:
我能成功发送第一帧(FF),也能收到对方返回的流控制帧(FC),但程序就是不会继续发送后续的连续帧(CF),最终会触发isotp.BlockingSendFailure异常。
举个具体的测试场景:
我使用的输入数据是:
input = ['0x67','0x03','0xec', '0x45', '0xf2', '0x63', '0xd0', '0xd8', '0xae', '0x9d', '0x2d', '0xb3', '0x23', '0x0', '0x30', '0x73', '0xc0', '0x89','0x73', '0xc0', '0x89']
对应的CAN帧交互情况是:
发送: 10 15 67 03 EC 45 F2 63 (第一帧FF)
接收: 30 08 14 00 00 00 00 00 (流控制帧FC)
结果: 没有发送任何连续帧,最终抛出BlockingSendFailure异常
我猜测问题可能出在ISO-TP的参数配置上,但自己排查了很久都没找到问题点。想请教下大家有没有遇到过类似的情况,或者能帮我看看参数哪里配置错了?非常感谢!
备注:内容来源于stack exchange,提问作者Hoangnguyen293
相关产品推荐
相关产品推荐

