2012-08-08 4 views
6

Ich arbeite an einem Projekt mit einem ArduinoMega2560. Es gibt mehrere serielle Schnittstellen zur Verfügung, und ich möchte eine Variable haben einen Verweis auf eine von ihnen, so etwas zu halten:Arduino Serial Objekt Datentyp, um eine Variable zu erstellen, die einen Verweis auf einen Port enthält

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

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

jedoch die Arduino-Dokumentation ist entweder begrenzt oder ich habe nicht gefunden die Informationen, nach denen ich suche. Ich denke, was ich brauche "Was ist der Typ für Serial, Serial1, etc?".

Antwort

9

Der zugrunde liegende C++ - Typ für die Serial-Objekte ist HardwareSerial. Sie können das in den Dateien in <arduino path>\hardware\arduino\cores\arduino finden. Sie können dann einen Zeiger mit Code wie folgt verwendet werden:

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

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

Das habe ich gebraucht. Vielen Dank. – Steve

+0

Kann es mit Referenzen gemacht werden? So sind diese Methodenaufrufe mit. nicht -> –

+1

@ Osman-Pascha: Wahrscheinlich, aber es wäre schwieriger, die Referenz zu definieren. Bei einer Schätzung könnte es etwas wie 'HardwareSerial & port = (etwas == etwasElse) sein? Seriell: Seriell1; Byte b = 5; port.write (b); ' – tinman

0

Ich weiß nichts über Arduino, aber die übliche Vorgehensweise bei den meisten Mikrocontrollern ist, dass Sie direkt auf den Registerbereich des Peripheriegeräts zeigen, in diesem Fall die serielle Schnittstelle. Nehmen wir an, ordnet Ihre MCU diese Register wie folgt aus:

// 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 

Sie dann Spur eines Hafen mit einem Zeiger, wie diese halten kann:

#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; 

Dies kann dann weiter ausgebaut werden, so dass Sie verwenden Sie die Register nur als Variablen, zum Beispiel mit Makros:

#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; 
} 

Dies ist, wie Sie normalerweise generische Hardware-Treiber für MCU-Peripheriegeräte mit mehr als einem gleichen Port an Bord schreiben.

+0

In der „Arduino Sprache“, das ich glaube, ist nur ein Präprozessor vor dem g eines Handoffs ++, Seriell ist ein Zeiger auf ein Objekt, kein Register. Ihre Sprache macht schnelles Prototyping ziemlich einfach, aber wie ich oben sagte, lässt die Dokumentation ein bisschen zu wünschen übrig. – Steve

+1

@Steve Oh? Dann würde ich Menschen dringend empfehlen, Embedded-Programmierung anstelle von Arduino-Programmierung zu lernen. – Lundin

+1

Das wäre in vielen Fällen richtig, aber wenn das Timing kein Problem ist und die Entwicklungszeit auf ein Minimum beschränkt werden muss, macht 'Serial.begin (9600); Serial.print ("Simple text command"); 'ist viel einfacher und schneller als die Einrichtung von Registern und Interrupts. Es ist im Grunde eine vorgefertigte Bibliothek, die jemand anderes geschrieben hat. – Steve