2012-08-08 24 views
6

Estoy trabajando en un proyecto con un ArduinoMega2560. Hay varios puertos serie disponibles, y me gustaría tener una variable para contener una referencia a uno de ellos, algo como esto:Arduino Tipo de datos de objeto en serie, para crear una variable que contenga una referencia a un puerto

SerialPort port; 
if (something == somethingElse) 
    port = Serial; 
else 
    port = Serial1; 

byte b = 5; 
port.write(b); 

Sin embargo, la documentación Arduino es limitada o no he encontrado la información que estoy buscando Creo que lo necesito "¿Cuál es el tipo de Serial, Serial1, etc.?".

Respuesta

9

El tipo de C++ subyacente para los objetos seriales es HardwareSerial. Puede encontrarlo en los archivos en <arduino path>\hardware\arduino\cores\arduino. A continuación, puede utilizar un punteros utilizando código como este:

HardwareSerial *port; 
if (something == somethingElse) 
    port = &Serial; 
else 
    port = &Serial1; 

byte b = 5; 
port->write(b); 
+0

Eso es lo que necesitaba. Muchas gracias. – Steve

+0

¿Se puede hacer con referencias? De modo que las llamadas al método están con. no -> –

+1

@ 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

0

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.

+0

En el "Arduino Language", que creo que es sólo un preprocesador antes de entregar a g ++, de serie es un puntero a un objeto, no un registro. Su lenguaje hace que la creación rápida de prototipos sea bastante fácil, pero como dije antes, la documentación deja un poco que desear. – Steve

+1

@Steve Oh? Entonces recomiendo encarecidamente a las personas que aprendan programación integrada en lugar de programar Arduino. – Lundin

+1

Eso sería cierto en muchos casos, pero cuando el tiempo no es un problema, y ​​el tiempo de desarrollo debe mantenerse al mínimo, haciendo 'Serial.begin (9600); Serial.print ("comando de texto simple"); 'es mucho más fácil y rápido que tener que configurar registros e interrupciones. Básicamente es una biblioteca prefabricada y lista para usar que alguien más escribió. – Steve

Cuestiones relacionadas