A USB-UART bridge (the most common brand name one is made by FTDI) is probably the easiest way.
On your custom hardware you use the regular UART port on the microcontroller and feeds it into the USB-UART bridge cable or chip which in turn plugs into your computer with a USB plug. On your PC you install USB drivers that make the computer think it is talking to a UART and write software on your computer as if it were a UART.
Before USB ports existed what you would have done is run the microcontroller UART through an RS-232 transceiver which converts the UART voltages to voltage levels appropriate for RS-232 signals and plug that into the computer with a dsub9 cable. The USB-UART bridge simulates the same thing, but with USB.
This is fast enough to do things like control but probably not fast enough to do things with streaming data (like machine vision).
RS-422 is extremely similar to RS-232. It is basically just UART but run through transceivers with different electrical signalling for longer distances. Can be used to have one transmitter drop the same message to multiple receivers that only listen and do not transmit back.
RS-485 is fairly similar because it is basically RS-422, but instead of being full-duplex it is half-duplex. That means no simultaneous two-way transmission which means you have to change up your protocol to account for this (the devices on both ends of the line can't just start transmitting whenever they want), however it is more suited for having more than 2 devices on the same line where all devices can transmit.
CAN is somewhat similar to RS-485 in that it is half-duplex but the signalling is quite different and it has a predefined message format. Namely, the pre-defined message format and different electrical signalling compared to RS-485 provide a standard addressing, error checking, and collision detection scheme (higher priority messages are able to transmit over top of lower priority messages transparently which leaves the higher priority message uninterrupted and stops the lower priority message, rather than interrupting both messages). RS-485 is incapable of this message override and requires interruption of both messages, and since there is no predefined addressing or protocol you need to cook up your own if you want more than two devices on the line (needs addressing) or more than one device to try transmitting whenever it wants (no master-slave relationships to coordinate communication on the line).
Beyond this you have native USB, ethernet, and all the fast but complicated stuff.