If your Arduino is damaged so that the onboard USB-to-serial conversion doesn't work any more, or you bought a cheap clone that doesn't reliable upload, you can use an external FTDI board to upload the programs to your Arduino.
In my case I was trying to upload some of the larger e-paper sketches I'd created, and sometimes my cheap clone Arduino Nano wouldn't accept the upload, it would instead give the an error message (when connected to my laptop running MacOS Catalina) containing the following:
avrdude ser_setspeed(): tcsetattr() failed
The problem was intermittent and I couldn't re-create it reliably. What seemed to work was unplugging the real-time clock board, then re-connecting it and pressing 'upload' on the Arduino IDE. That would work around half the time. Other attempts to 'jog' the board, such as pressing the reset button, or unplugging it and then plugging it back in again didn't seem to make a difference.
In the end I gave up and resorted to using an external FTDI board to upload the sketch to the Nano reliably.
I used a board with an FT232RL chip, which has a 5V and 3.3V options controlled via a jumper pin, the nano requires the 5v option to power it. This converts USB communication to serial via the chip, to UART (universal asynchronous receiver/transmitter) signals,which would normally happen in the onboard via the Nano's USB connector and onboard chip, but in my case didn't reliably. It should be wired as follows:
|VCC (jumper set to 5V)||VCC|
|DTR, via 0.1µf capacitor||RST|
The capacitor between the Data Terminal Ready (DTR) and reset (RST) pins isn't completely essential, you can try and just press the reset button by yourself and just the right time, but it's unreliable. Apparently, from the forum posts I could find, slightly larger capacitors are also OK.
Once wired up, select the board and the USB connection in the Arduino IDE in the usual way (at least on MacOS) and then click upload, sit back and watch the flashing lights.