Der Teil ist doch leicht verständlich:
void sim808_init(void * uart_device, char num)
{
if(num)
serialSIM808 = (HardwareSerial*)uart_device;
else
serialSIM808 = (SoftwareSerial*)uart_device;
}
Wenn num 0 ist wird ein Cast auf SoftwareSerial gemacht und wenn num ungleich 0 ist wird ein Cast auf HardwareSerial gemacht.
Ein void* Zeiger ist eine Art Platzhalter Datentyp. Dem kannst du alles übergeben, aber damit den Zeiger verwenden kann muss man ihn auf einen richtigen Datentyp casten
Das kann aber nicht gehen (ist auch auskommentiert. Vielleicht aus einer früheren Version):
Stream *serialSIM808 = NULL;
serialSIM808->begin(baud);
serialSIM808 ist ein Zeiger auf Stream (das ist die Klasse von der beide Serial Klassen abgeleitet sind). Die Stream Klasse hat aber keine begin() Methode. Die begin() Methode ist jeweils in den Unterklassen selbst definiert und nicht virtuell. Sie kann also nicht über einen Zeiger auf die Oberklasse aufgerufen werden.
Selbst wenn das gehen würde könnte man sich den void-Zeiger sparen und gleich einen Zeiger auf Stream übergeben
Dann musst du suchen wo die sim808_init() Methode aufgerufen wird. Und da gibt es zwei Konstruktoren:
DFRobot_SIM808(HardwareSerial *mySerial);
DFRobot_SIM808(SoftwareSerial *mySerial);
Einen für HardwareSerial und einen für SoftwareSerial. Also beim erstellen des Objekts einfach eine Instanz von HardwareSerial übergeben und schon geht es. Das ist was du hier machst:
DFRobot_SIM808 sim808(&mySerial);
Statt &mySerial machst du &Serial1 oder &Serial2 Der Compiler merkt das was du übergibst und ruft dann den entsprechenden Konstruktor auf
Serial solltest du nicht nehmen. Das ist die normale USB Schnittstelle. Dass diese nicht belegt wird ist der Grund weshalb man da normal SoftwareSerial verwendet