[Arduino] Ethernet und Timer

BLACKDIAMONT

Lt. Commander
Registriert
Nov. 2012
Beiträge
1.471
Moin,

als Hardware habe ich:
- Mega 2560
- Wiznet Shield W5100
- 4x20 LCD
- Verschiedene Sensoren

Ich habe nach dieser Anleitung via Serial3 verschiedene Geräte am laufen.

Der Sketch funktioniert zwar, aber dadurch das alles in einer while-schleife läuft wird Logischerweise der Rest im loop nicht abgearbeitet(LCD hängt etc).
Hab dann mit TimerOne versucht ein Interrupt zu setzen was zum gleichen Ergebniss führt.

Witzigerweise wenn der Arduino "hängt" kann ich den weiter anpingen .. somit sollte es ja möglich sein das der Telnet Sketch unabhängig vom loop läuft.
Offiziell kann ein Arduino kein Multitasking, aber ich bezweilfe das z.b. der ICMP Ping nur vom Wiznet Controller beantwortet wird.

Beim googlen habsch etwas ähnliches entdeckt wo als Lösung statt der while-schleifen einfach ein if verwendet wird.
Bringt aber soweit nichts, da ich sonsten immer Enter drücken muss damit der Arduino mir eine Zeile vom Serial ausgibt ....

Vielleicht stehe ich auch einfach nur auf dem Schlauch :D

Hat einer von euch vielleicht eine Idee oder die "rettende Lösung"? :D
 
Zeig uns doch mal dein Code.
 
Alles kann ich nicht zeigen, sind einige hundert Zeilen ;)

Code:
void setup() {
  lcd.setCursor(0, 0);
  Wire.begin();
  //.. weiterer setup stuff
  setSyncProvider(getNtpTime);
  telsrv.begin();
  //Raspberry Pi Serial conn
  Serial3.begin(115200);
 }


void loop {
//.. anderer stuff
EthernetClient telnet = telsrv.available();
  if (telnet) {
    String clientMsg ="";
    while (telnet.connected()) {
      while (telnet.available()) {
        char c = telnet.read();
        clientMsg+=c; // store received chars up to newline
        if (c == '\n') {
          Serial3.print(clientMsg); // then send the message through serial
          clientMsg = "";
          Serial3.flush();
      }
    }
    // receive
    int incomingBytes = 0; // for incoming serial data
    while (Serial3.available() > 0) { // if data has been received from the serial connection
      incomingBytes = Serial3.read();
      telnet.print(char(incomingBytes)); // print the char data back to the client
      if (char(incomingBytes) == '\n') {
         telnet.flush();
      }
    }  
  }
 }
 
Da hast du ja immer noch die while-Schleifen.
 
Wenn die ein if sind, muss ich enter gedrückt halten damit ich empfangen kann.

Hatte ich ja oben geschrieben^^
 
Du musst Interrupts (vom Timer ausgelöst) verwenden, statt while-Schleifen.

Du musst "telnet = telsrv.available()" auslagern (so dass telnet nicht bei jedem durchlauf überschrieben wird) und dann "while (telnet.connected())" mit "if (telnet.connect())" ersetzen.
 
Zuletzt bearbeitet:
Auslagern, lässt sich nicht umsetzen da der Arduino dann nicht mehr bootet.

Timer Interrupts war ne idee, nur finde ich keine Umsetzung :/

Edit: Hat nochjemand eine Idee wie das Umgesetzt werden kann?
 
Zuletzt bearbeitet:
Wie hast du es ausgelagert? (Gerne auch den Code zeigen...)

Wenn mir dir alles aus der Nase ziehen muss, macht helfen kein Spaß.
 
Zurück
Oben