2012-08-08 15 views
6

Sto lavorando a un progetto con un ArduinoMega2560. Ci sono più porte seriali disponibili, e mi piacerebbe avere una variabile per contenere un riferimento ad uno di loro, qualcosa di simile:Arduino Tipo di dati dell'oggetto seriale, per creare una variabile contenente un riferimento a una porta

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

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

Tuttavia, la documentazione Arduino è sia limitato o non ho trovato le informazioni che sto cercando. Penso a quello che mi serve "Qual è il tipo di Serial, Serial1, etc?".

risposta

9

Il tipo C++ sottostante per gli oggetti seriali è HardwareSerial. Lo puoi trovare nei file in <arduino path>\hardware\arduino\cores\arduino. È quindi possibile utilizzare un puntatori utilizzando il codice come questo:

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

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

Questo è quello di cui avevo bisogno. Grazie mille. – Steve

+0

Può essere fatto con riferimenti? Quindi le chiamate al metodo sono con. non -> –

+1

@ 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

0

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.

+0

Nella "Arduino Language", che credo sia solo un preprocessore prima di consegnare a mano a g ++, di serie è un puntatore ad un oggetto, non un registro. Il loro linguaggio rende la prototipazione rapida abbastanza facile, ma come ho detto sopra, la documentazione lascia un po 'a desiderare. – Steve

+1

@Steve Oh? Quindi raccomanderei vivamente alle persone di imparare la programmazione integrata invece della programmazione Arduino. – Lundin

+1

Ciò sarebbe vero in molti casi, ma quando il tempo non è un problema, e il tempo di sviluppo deve essere ridotto al minimo, facendo 'Serial.begin (9600); Serial.print ("Simple text command"); 'è molto più semplice e veloce rispetto alla necessità di impostare registri e interrupt. È fondamentalmente una libreria pre-fatta, pronta per essere passata da qualcun altro. – Steve