Pythonで実装します。
PythonでCAN通信するには、python-canを使えばよいようですが、
私の職場はインターネットに接続させてもらえないので、
pipでpython-canをインストールすることができません。
pythonでsocketが使えるので、SocketCANを使って、
CAN通信するプログラムを作ることにしました。
動作環境も前回と同じく、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 cansend_stdframe(id, data): if(CAN_MAX_DLEN < len(data)): print('dlc too long.', file=sys.stderr) return -1 s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW) s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, None, 0) # no loopback loopback = 0 # 0 = disabled, 1 = enabled(default) s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK, loopback) try: s.bind((CAN_NAME,)) except OSError: print('bind error', file=sys.stderr) return -4 dlc = len(data) bdata = bytes(data) frame = struct.pack('IB3x8s', id, dlc, bdata) if(s.send(frame) < CAN_MTU): print('send', file=sys.stderr) return -5 s.close() return 0 if __name__ == '__main__': def main(): data = [ 0x11, 0x22, 0x33, 0x44 ] cansend_stdframe(0x0123, data) main()
これで、id=0x123,data=0x11 0x22 0x33 0x44 のデータを1回送信します。
0 件のコメント:
コメントを投稿