Hey,
das mit dem fehlenden Debugger ist echt sehr ärgerlich 
Alles nur über die serielle Schnittstelle auszulesen ist auch keine alternative 
Auf der Arbeit verwenden wir einen STM Prozessor (klar, der war teurer^^) aber der hat soweit ich weiß auch nur einen Kern und kann trotzdem debuggen, irgendwie komisch?!
Ich verwende auf dem Arduino ein RTOS (free RTOS um genau zu sein). Klar die können nur seriell abgearbeitet werden, aber das Betriebssystem teilt die Task so ein, dass die der Reihe nach mal Pause haben.
So wirkt es zumindest nach außen wie eine parallele Aufgabenverteilung 
Ein Beispiel für einen Task: ich prüfe in Regelmäßigen Abständen ob neue Daten im RX Puffer oder TX Puffer liegen.
void write_tx_buffer( void * params)
{
uint8_t tx_single_packet_length = 0;
for (;
{
//prüfen ob der Empfangspuffer überhaupt korrekt definiert wurde
if (usb_write_buffer_queue != NULL)
{
//prüfen ob überhaupt Nachrichten auf das senden warten
UBaseType_t messages_waiting = uxQueueMessagesWaiting(
usb_write_buffer_queue);
if (messages_waiting > 0)
{
//ja wir haben Post
BaseType_t read_queue_success = xQueueReceive(
usb_write_buffer_queue, (void *) &single_tx_packet,
(TickType_t ) 5);
if (read_queue_success == pdTRUE)
{
//das lesen des Items war erfolgreich
tx_single_packet_length = single_tx_packet.packet_length;
//wir können maxmimal 64 Byte übertragen
if (tx_single_packet_length > 64)
{
tx_single_packet_length = 64;
}
//jetzt kopieren wir unsere Daten in ein Byte Array
memcpy(tx_byte_array, &single_tx_packet,
tx_single_packet_length);
//jetzt noch die Daten senden
Serial.write(tx_byte_array, tx_single_packet_length);
}
}
}
vTaskDelay(100);
}
}
Dieser Task läuft alle 100ms 1 mal und prüft ob neue Daten in der TX Queue liegen, falls ja werden die in den TX Puffer gepackt.
Leider habe ich gerade das Problem, dass keine Daten ankommen. Jetzt muss ich morgen hinter jede Zeile ein Serial.println setzen um zu schauen wo es hängt 
Nicht sehr elegant
PS: seht ihr vllt auf die schnelle den Fehler? 