I was trying to get some CP code to talk to Processing over a serial port interface. Of course, the CP REPL is normally available on whatever serial port the board mounts by default. This is a little complicated, because although you can use something like print from the REPL (or code.py) to print a value to the console, sys.stdin and sys.stdout are text-based streams, which may not be what you want. And you'll get REPL noise to boot. Not ideal.
This is where usb_cdc comes in. It's a handy library for managing the USB CDC (serial) on most CircuitPython boards. First, usb_cdc can be used to control how many serial ports CP will provide at startup. You can modify boot.py to make this work:
import usb_cdc
usb_cdc.enable(console=True, data=False)
This is equivalent to the standard setup. When you plug in your CP device, you'll get one serial port, which will have the REPL on it, and is mapped to sys.stdin and sys.stdout, all of which goes through the console object, which is a binary stream. This means you can do stuff like this in your code.py:
import usb_cdc
console = usb_cdc.console
console.write(bytes([1]))
This is great, since it means you can send binary data, which is useful if you don't want to muck with the REPL's textstream. However, you're still using the same serial port. We can do better. If you put this in boot.py, you'll get a second serial port when you plug in your board:
import usb_cdc
usb_cdc.enable(console=True, data=True)
Now you can connect to the second serial port and avoid the REPL noise. You can do this with the usb_cdc.data binary stream, in either the REPL or from code.py:
import usb_cdc
console = usb_cdc.data
console.write(bytes([1]))
For reference, take a look at the documentation for the usb_cdc library and this handy guide to configuring the USB ports in CircuitPython.
There is a handy utility library, Adafruit_Board_Toolkit, that provides some utilities for inspecting the serial ports on a system to see if they're avaliable from CP and if so, if they console or data reports.
Once you've installed this library in Python, it's pretty easy to use. For example, to list all of the likely CP serial ports:
from adafruit_board_toolkit import circuitpython_serial as cps
print([port.device for port in cps.comports()])
Thank you for confirming that it works on these devices.
When I do that on a Pico, then I lock myself out completely and I have to nuke it. I do not even see safe mode. I have never seen it even once.
When I try to use my switching approach, then I run into fundamental errors because:
If the USB data is not used because it is in a switched-off code branch, then the compiler still sees the code and it can't compile it because the data device is not there. I have seen something like that but I might try again. It's a painful process.
I have also tried logging. But logging is useless because it cannot log syntax errors.
From my perspective, this sucks because it is so basic. I discovered the hard way that one cannot develop CircuitPython without the console and REPL. That is the only supported work flow. So one would perhaps have to figure out how to get the needed endpoint pairs that are discussed in
Customizing USB Devices in CircuitPython
But anyway, once again I thank you very much for getting back to me with your device info.