Non so nulla di Arduino, ma il modo in cui questo viene comunemente fatto sulla maggior parte dei microcontrollori è che si punta direttamente nell'area di registro del perierale, in questo caso la porta seriale. Consente di assumere il vostro MCU mappe tali registri in questo modo:
// serial port 1
0x1234 SERIAL_CONTROL_REG
0x1235 SERIAL_DATA_REG
0x1236 SERIAL_STATUS_REG
// serial port 2
0x2000 SERIAL_CONTROL_REG
0x2001 SERIAL_DATA_REG
0x2002 SERIAL_STATUS_REG
È quindi possibile tenere traccia di un porto con un puntatore, come questo:
#define SERIAL_PORT1 ((volatile uint8_t*)0x1234)
#define SERIAL_PORT2 ((volatile uint8_t*)0x2000)
typedef volatile uint8_t* serial_port_t;
...
serial_port_t port;
if (something == somethingElse)
port = SERIAL_PORT1;
else
port = SERIAL_PORT2;
Questo può poi essere ulteriormente ampliato in modo da poter utilizzare i registri altrettanto variabili, ad esempio con le macro:
#define SERIAL_CONTROL_REG(offset) (*(offset + 0))
#define SERIAL_DATA_REG(offset) (*(offset + 1))
#define SERIAL_STATUS_REG(offset) (*(offset + 2))
if(SERIAL_STATUS_REG(port) & some_mask)
{
SERIAL_DATA_REG(port) = 0xAA;
}
Questo è il modo in genere si scrive driver hardware generici per le periferiche MCU con più di una porta identica a bordo.
Questo è quello di cui avevo bisogno. Grazie mille. – Steve
Può essere fatto con riferimenti? Quindi le chiamate al metodo sono con. non -> –
@ Osman-pasha: Probabilmente, ma sarebbe più scomodo definire il riferimento. A occhio e croce potrebbe essere qualcosa come 'HardwareSerial & port = (qualcosa == qualcosaElse)? Seriale: Seriale1; byte b = 5; port.write (b); ' – tinman