hardbyte / hardbyte/python-can

Re-connect with PCANBasic fails after failed connection attempt

Open
#729 1 comment 0 reactions 0 assignees View on GitHub
backend:pcan
Dominant language
Python
Stars
1.6k
Forks
697
PR merge metrics
No merged PRs in 30d

Description

I am using `python-can` with an PEAK-Dongle.
Sometimes I get an exception during Bus creation than I would like try another connection attempt, but this Fails, because `python-can` has intitialized the PCAN-DLL but did not uninitialize it.
And since [multiple Connections are not allowed with PCANBasic](378) the second connection attempt also Fails (and all other in the same process)

The issue can be Show with the following script
```python
import can
try:
bus = can.interface.Bus(bustype="pcan", channel="PCAN_USBBUS1", bitrate=5000000)
bus.shutdown()
except:
print("exception")
# the following attempt ALWAYS fails if the first attempt has also failed
bus = can.interface.Bus(bustype="pcan", channel="PCAN_USBBUS1", bitrate=5000000)
bus.shutdown()
```

The problematic code is [here](https://github.com/hardbyte/python-can/blob/develop/can/interfaces/pcan/pcan.py#L212). Before this line the PCAN-Dll get initialized but if afterwards a exception is raised, it does not get uninitilized.

A simple solution can be the following:
````python

class PcanBus(BusABC):
def __init__(…):
# ...
try:
if result != PCAN_ERROR_OK:
raise PcanError(self._get_formatted_error(result))

result = self.m_objPCANBasic.SetValue(
self.m_PcanHandle, PCAN_ALLOW_ERROR_FRAMES, PCAN_PARAMETER_ON
)

if result != PCAN_ERROR_OK:
raise PcanError(self._get_formatted_error(result))

if HAS_EVENTS:
self._recv_event = CreateEvent(None, 0, 0, None)
result = self.m_objPCANBasic.SetValue(
self.m_PcanHandle, PCAN_RECEIVE_EVENT, self._recv_event
)
if result != PCAN_ERROR_OK:
raise PcanError(self._get_formatted_error(result))

super().__init__(channel=channel, state=state, bitrate=bitrate, *args, **kwargs)
except:
self.m_objPCANBasic.Uninitialize(self.m_PcanHandle)
raise
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.