diff --git a/can/interfaces/socketcan/utils.py b/can/interfaces/socketcan/utils.py index b718bb69e..55e7eb392 100644 --- a/can/interfaces/socketcan/utils.py +++ b/can/interfaces/socketcan/utils.py @@ -38,7 +38,7 @@ def pack_filters(can_filters: Optional[typechecking.CanFilters] = None) -> bytes return struct.pack(can_filter_fmt, *filter_data) -_PATTERN_CAN_INTERFACE = re.compile(r"v?can\d+") +_PATTERN_CAN_INTERFACE = re.compile(r"(sl|v|vx)?can\d+") def find_available_interfaces() -> Iterable[str]: diff --git a/doc/interfaces/socketcan.rst b/doc/interfaces/socketcan.rst index d3a583d75..1e82d8827 100644 --- a/doc/interfaces/socketcan.rst +++ b/doc/interfaces/socketcan.rst @@ -57,6 +57,28 @@ existing ``can0`` interface with a bitrate of 1MB: sudo ip link set can0 up type can bitrate 1000000 +CAN over Serial / SLCAN +~~~~~~~~~~~~~~~~~~~~~~~ + +SLCAN adapters can be used directly via :doc:`/interfaces/slcan`, or +via :doc:`/interfaces/socketcan` with some help from the ``slcand`` utility +which can be found in the `can-utils `_ package. + +To create a socketcan interface for an SLCAN adapter run the following: + +.. code-block:: bash + + slcand -f -o -c -s5 /dev/ttyAMA0 + ip link set up slcan0 + +Names of the interfaces created by ``slcand`` match the ``slcan\d+`` regex. +If a custom name is required, it can be specified as the last argument. E.g.: + +.. code-block:: bash + + slcand -f -o -c -s5 /dev/ttyAMA0 can0 + ip link set up can0 + .. _socketcan-pcan: PCAN diff --git a/test/open_vcan.sh b/test/open_vcan.sh index bd02ad752..b6f4676b7 100755 --- a/test/open_vcan.sh +++ b/test/open_vcan.sh @@ -5,3 +5,7 @@ modprobe vcan ip link add dev vcan0 type vcan ip link set up vcan0 mtu 72 +ip link add dev vxcan0 type vcan +ip link set up vxcan0 mtu 72 +ip link add dev slcan0 type vcan +ip link set up slcan0 mtu 72 diff --git a/test/test_socketcan_helpers.py b/test/test_socketcan_helpers.py index f3fbe6d26..ad53836f2 100644 --- a/test/test_socketcan_helpers.py +++ b/test/test_socketcan_helpers.py @@ -31,10 +31,12 @@ def test_find_available_interfaces(self): result = list(find_available_interfaces()) self.assertGreaterEqual(len(result), 0) for entry in result: - self.assertRegex(entry, r"v?can\d+") + self.assertRegex(entry, r"(sl|v|vx)?can\d+") if TEST_INTERFACE_SOCKETCAN: - self.assertGreaterEqual(len(result), 1) + self.assertGreaterEqual(len(result), 3) self.assertIn("vcan0", result) + self.assertIn("vxcan0", result) + self.assertIn("slcan0", result) if __name__ == "__main__":