adafruit / Adafruit_CircuitPython_BLE

Bluetooth Low Energy (BLE) library for CircuitPython
MIT License
127 stars 58 forks source link

UARTService.readinto with "memoryview" slice and "bytearrary" causes ValueError: length argument not allowed for this type #128

Open dh-metre opened 3 years ago

dh-metre commented 3 years ago

byte_count = device.readinto(memoryview(in_buf)[start_ptr:])

causes: ValueError: length argument not allowed for this type

also tried with "bytearray" and got same error.

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "dev.py", line 308, in <module>
  File "lib/metre/gAsynco.py", line 121, in run
  File "lib/metre/gAsynco.py", line 522, in run_until_complete
  File "lib/metre/gAsynco.py", line 506, in run_until_complete
  File "lib/metre/gAsynco.py", line 196, in _wrapped_coro
  File "lib/metre/gAsynco.py", line 394, in _wrapper
  File "dev.py", line 234, in serial_task
  File "adafruit_ble/services/nordic.py", line 77, in readinto
ValueError: length argument not allowed for this type

I poked around and see this in nordic.py:

    def readinto(self, buf, nbytes=None):
        """
        Read bytes into the ``buf``. If ``nbytes`` is specified then read at most
        that many bytes. Otherwise, read at most ``len(buf)`` bytes.
        :return: number of bytes read and stored into ``buf``
        :rtype: int or None (on a non-blocking error)
        """
        return self._rx.readinto(buf, nbytes)

Looking futher in _blio.CharacteristicBuffer at suggestion from @dhalbert it looks like the ValueError: length argument not allowed for this type is thrown because two parameters are passed in return self._rx.readinto(buf, nbytes) above.

dh-metre commented 3 years ago

Changing line 77 in nordic.py to return self._rx.readinto(buf) appears to be one way resolve the issue. I tested this.

jepler commented 3 years ago

@dh-metre please consider submitting a pull request to fix this problem!