macOS: rework list_ports to support unicode product descriptors. #364
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
A number of Arm-based microcontrollers, such as the kinetis-based Teensy 3 family, provide a native USB interface that allows the user to control a number of attributes, such as the product descriptor string. However, macOS exhibits some weird behavior where it mangles specifically the product descriptor string (and as far as I can tell, only the product descriptor string) on USB serial devices (this also does not seem to happen with other types of USB device). The mangling, which replaces all non-alphanumeric characters with underscores, appears to happen somewhere deep in the kernel's BSD serial subsystem. In order to work around this, the device's product name can be queried with a different IOKit call, specifically
IORegistryEntryGetName
, which appears to be aliased directly to the (unmangled) USB product descriptor string for all USB devices.Note: I'm not sure what versions of macOS pyserial aims to support, but I have tested this (briefly) on both 10.11 and 10.13.
This PR also attempts to make a few correctness fixes to the way pyserial interfaces with IOKit. These have been squashed into the same commit for the sake of brevity.