python-can backend for the Waveshare 2-CH-CAN-TO-ETH bridge that uses a fixed 13‑byte TCP wire format.
Works with python -m can.viewer/logger/player and plain can.Bus(...).
Transport: TCP server on the device (e.g.,
:20001for CAN1,:20002for CAN2).
Frames: 13 bytes:[flags/dlc][id:4][data:0..8 padded]
References
- python-can documentation: python-can.readthedocs.io — see Bus API, Command Line Tools, and Configuration.
- Waveshare product page: 2-CH-CAN-TO-ETH and vendor Wiki.
pip install can-waveshare
# or from source (editable):
pip install -e .[dev]# Most portable: pass channel as host:port
python -m can.viewer -i waveshare -c 172.31.11.67:20001
# Or forward kwargs directly to the bus:
python -m can.viewer -i waveshare --bus-kwargs host=172.31.11.67 port=20001The stock CLIs read only the [default] section. Put this in ~/.canrc:
[default]
interface = waveshare
channel = 172.31.11.67:20001Then:
python -m can.viewerIf you want multiple profiles, either (a) swap rc files or (b) write a tiny launcher in code and use Bus(config_context="waveshare2") to select other sections.
import can
# explicit kwargs:
with can.Bus(interface="waveshare", host="172.31.11.67", port=20001) as bus:
bus.send(can.Message(arbitration_id=0x123, data=b"\x11\x22\x33", is_extended_id=False))
print(bus.recv(1.0))
# or via channel (parses host:port, tcp://host:port, [ipv6]:port, or aliases can1/can2):
with can.Bus(interface="waveshare", channel="172.31.11.67:20001") as bus:
print(bus.recv(1.0))- CAN 2.0 (0..8 data bytes). CAN‑FD not supported by Waveshare wire format.
- Software filters (
can_filters) supported in the backend. - Best‑effort own‑echo suppression when
receive_own_messages=False(default). SetTrueto see echoes. - Periodic TX via
bus.send_periodic(...)works (python-can broadcast manager callssend()repeatedly).
Apache 2.0