2017/09/17

Raspberry PiでCAN通信 その6【Pythonで標準フレームの受信】

前回のC言語で書いたCANの標準フレームの受信を
Pythonで実装します。

動作環境も前回と同じく、OS:raspbian jessie
仮想CANデバイス(vcan1)でテストしています。

#! /usr/bin/env python3
# -*- coding: utf-8 -*-

"""
    sudo modprobe vcan
    sudo ip link add dev vcan1 type vcan
    sudo ip link set vcan1 up
"""

import sys
import socket
import struct

CAN_MAX_DLEN = 8
CAN_MTU = 16

CAN_NAME = 'vcan1'

def canrecv_stdframe():

    s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)

    try:
        s.bind((CAN_NAME,))
    except OSError:
        print('bind error', file=sys.stderr)
        return -1

    frame = s.recv(CAN_MTU)

    id, dlc, bdata = struct.unpack('IB3x8s', frame)
    data = bdata.hex()

    s.close()

    return id, dlc, data

if __name__ == '__main__':
    def main():
        id, dlc, data = canrecv_stdframe()

        print('id=%x, dlc=%s, data=%s' % (id, dlc, data))

    main()

これで、標準フレームを1回受信し、表示して終わります。

0 件のコメント:

コメントを投稿