Een van de terminal programmas die automatisch weer verbinden is Tera Term; ik hoop dat je Windows gebruikt.
Een paar dingen om rekening mee te houden
1)
if(!Serial) en while(!Serial) vertellen je slechts eenmalig dat een verbinding met een terminal programma was gemaakt. Je kunt het niet gebruiken om te bepalen of een ProMicro wordt los getrokken van de PC's USB poort of als het terminal programma wordt gesloten, alleen om te bepalen of de verbinding ooit was opgezet.
Onderstaande sketch demonstreert dat.
#define PROMICRO
#ifdef PROMICRO
const byte ledPin = 17;
#define LED_ON LOW
#else
const byte ledPin = LED_BUILTIN;
#define LED_ON HIGH
#endif
void setup()
{
digitalWrite(ledPin, !LED_ON);
pinMode(ledPin, OUTPUT);
Serial.begin(57600);
// just to make sure we can see that the led is initially off
delay(5000);
}
void loop()
{
static uint32_t nextUpdateTime;
uint32_t currentTime = millis();
// if terminal not open
if (!Serial)
{
digitalWrite(ledPin, LED_ON);
}
else
{
digitalWrite(ledPin, !LED_ON);
}
}
Run het programma zonder terminal programma; de led zal aangaan om aan te geven dat er geen verbinding met een terminal programma is. Vervolgens kun je een terminal programma starten, vebinden met de seriele poort en de led zal uit gaan. Als je de verbinding in het terminal programma sluit (of het terminal programma sluit) zal de led niet opnieuw aangaan.
Noot: while(!Serial) gebruik je om er zeker van te zijn dat je geen data van de Arduino mist na een reboot. De code wacht to een terminal programma de verbinding heeft opgezet; het is iets dat je waarschijnlijk niet wilt gebruiken als je onmiddelijk na een reset data wilt verzamelen van b.v. sensors.
2)
Bij een 32U4 (en waarschijnlijk iedere processor met native USB) kun je de timing van je programma grondig verknoeien als je print, vevolgens de verbinding verbreekt en blijft printen. Onderstaand programma demonstreert dat
#define PROMICRO
#ifdef PROMICRO
const byte ledPin = 17;
#define LED_ON LOW
#else
const byte ledPin = LED_BUILTIN;
#define LED_ON HIGH
#endif
byte ledState = !LED_ON;
void setup()
{
digitalWrite(ledPin, ledState);
pinMode(ledPin, OUTPUT);
Serial.begin(57600);
}
void loop()
{
static uint32_t nextUpdateTime;
uint32_t currentTime = millis();
// blink led
ledState = !ledState;
digitalWrite(ledPin, ledState);
delay(200);
// print some data every second
if (currentTime >= nextUpdateTime)
{
nextUpdateTime += 1000;
Serial.println(currentTime / 1000UL);
}
}
Dit programma flitst de led (200ms) en print iedere seconde. Na het laden van het programma zal de led keurig blinken zoals verwacht. Als je vervolgens een vebinding opzet in het terminal programma zal het allemaal netjes blijven werken en zul je data in het terminal programma zien. Als je echter de verbinding verbreekt zal de led onregelmatig gaan flitsen. Als je de 1 seconde timing verwijdert zal de led ongeveer idere seconde flitsen inplaats van ieder 200ms.
Om dit te voorkomen moet je controleren of er ruimte is in de zend buffer om nog te printen. Dit doe je met Serial.availableForWrite() zoals hieronder getoond. Het getal 10 is min of meer willekeurig gekozen; als b.v. de langste data slechts 5 is kun je het veranderen naar 5. Ik denk dat de maximale waarde 64 is, maar weet dat niet zeker; de buffer is 64 bytes maar er is misschien nog een verborgen buffer waar de data nog naar toe wordt gecopieerd.
#define PROMICRO
#ifdef PROMICRO
const byte ledPin = 17;
#define LED_ON LOW
#else
const byte ledPin = LED_BUILTIN;
#define LED_ON HIGH
#endif
byte ledState = !LED_ON;
void setup()
{
digitalWrite(ledPin, ledState);
pinMode(ledPin, OUTPUT);
Serial.begin(57600);
}
void loop()
{
static uint32_t nextUpdateTime;
uint32_t currentTime = millis();
// blink led
ledState = !ledState;
digitalWrite(ledPin, ledState);
delay(200);
// print some data every second
if (currentTime >= nextUpdateTime)
{
nextUpdateTime += 1000;
// print some data every second
if (Serial.availableForWrite() > 10)
{
Serial.println(currentTime / 1000UL);
}
}
}