No sé nada sobre Arduino, pero la forma en que esto se hace comúnmente en la mayoría de los microcontroladores es que apunta directamente al área de registro del periférico, en este caso, el puerto serie. Vamos a suponer que su MCU mapea los registros de esta manera:
// 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
A continuación, puede seguir la pista de un puerto con un puntero, así:
#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;
Esto entonces se puede ampliar para que pueda utilizar los registros al igual que las variables, por ejemplo con macros:
#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;
}
Así es como se suele escribir controladores de hardware genéricos para los periféricos MCU con más de un puerto idéntica a bordo.
Eso es lo que necesitaba. Muchas gracias. – Steve
¿Se puede hacer con referencias? De modo que las llamadas al método están con. no -> –
@ Osman-pasha: Probablemente, pero sería más difícil definir la referencia. Supongo que podría ser algo así como 'HardwareSerial & port = (something == somethingElse)? Serie: Serial1; byte b = 5; port.write (b); ' – tinman