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 件のコメント:
コメントを投稿