尝试使用PiCAN2和raspberry pi记录CAN数据时未找到数据

2024-06-23 19:12:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我不确定我在这里到底在做什么,需要一些指导来为我指出有关CAN总线嗅探的正确方向。 我目前正在使用带有覆盆子pi 4的PiCAN2(带有gps和陀螺仪)来嗅探来自mobileye检测单元的CAN总线输出。我有MobileEye的CAN输出协议,raspberry pi设置了所有安装的库,除了CAN数据的捕获外,一切似乎都正常工作(记录器完美地捕获GPS和所有运动学数据)。 我一直在兜圈子,因为我似乎找不到为什么我从MobileEye装置上得到非常断断续续的can数据

我正试图得到发送请求的单位,并等待任何输出,但没有得到任何东西

我甚至试着跑:

candump can0cansniffer can0 并且什么也得不到

我也尝试过直接系在汽车的CAN上,也尝试过间歇性CAN。 我在一个跳线上焊接了一个120欧姆的电阻,以桥接JP2,但这会使can0接口消失。使用ifconfig确认了这一点,因此我将跳线保持打开状态

有时我还会收到一条sm.smBUS错误消息,指出bus.recv()不存在

我的代码如下:

from gps import *
import datetime
import sys
import smbus
import math
import time, inspect
import signal
import serial
import RPi.GPIO as GPIO
import can
import os
import binascii
import bitstring
from bitstring import BitArray
import threading
from threading import Thread
from can import Message

try:
    import queue
except ImportError:
    import Queue as queue

#### Bring up can0 interface at 500kbps
os.system("sudo /sbin/ip link set can0 up type can bitrate 500000")
time.sleep(0.1)
print('Ready')

#### define global variables
PICANGPS_PORT = "/dev/serial0"
led = 22
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(led,GPIO.OUT)
GPIO.output(led,True)
mbdata = ''
PID_REQUEST= 0x7DF

###### ive left out some bits relating to GPS and the file name definitions

#### Communicate with CAN interface
try:
    bus = can.interface.Bus(channel='can0', bustype='socketcan_native')
except OSError:
    print('Cannot find PiCAN board.')
    GPIO.output(led,False)
    exit()

#### CAN Receive thread
def can_rx_task():  # Receive thread
    while True:
        print ('Receiving Message')
        msg = bus.recv()
        if msg.arbitration_id == MB_DISPLAY:
            q.put(msg)          # Put message into queue
            print ('Received Message!')
        if msg.arbitration_id == CAR_SIGNALS:
            q.put(msg)          # Put message into queue
            print ('Received Message!')

#### CAN Transmit thread
def can_tx_task():  # Transmit thread
    while True:
        GPIO.output(led,True)
        # Sent a Engine coolant temperature request
        msg = can.Message(arbitration_id=PID_REQUEST,data=[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00],extended_id=False)
        bus.send(msg)
        time.sleep(0.05)
        GPIO.output(led,False)
        time.sleep(0.05)

q = queue.Queue()
rx = threading.Thread(target = can_rx_task)
rx.start()
tx = threading.Thread(target = can_tx_task)
tx.start()

#### main loop
try:
    while True:
        # create log file - timestamped 
        f=open(path+fname+".csv",'a')
        # get current timestamp
        now = datetime.datetime.now()
        picantimestamp = now.strftime("%Y/%m/%d %H:%M:%S.%f")

        #### mobileye CAN sniff loop
        for i in range(4):
            # CAN sniff for CAN data frame
            if q.empty() != True:   # Check if there is a message in queue
                mbdata = q.get()
                c = '{0:f} {1:d} {2:x} '.format(mbdata.timestamp,count, mbdata.arbitration_id, mbdata.dlc)
                s = ''
                print ('Received CAN Message')
                for j in range(mbdata.dlc):
                    s +=  '{0:x} '.format(mbdata.data[j])

有人对我应该如何解决这个问题有什么建议吗? 很高兴进一步讨论,我只是有点困惑,很乐意接受任何意见


Tags: fromimportidtruemessageledgpioqueue

热门问题