Keresés soros port adatokból

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Adamyno
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2015. április 16. csütörtök, 19:29

Keresés soros port adatokból

Hozzászólás Szerző: Adamyno »

Létezik egy Serial.find() utasítás, amit kipróbáltam és egész jó volt.

Viszont van egy kis gond, de valószínűleg én nem csinálok jól valamit.
Modemből olvasok ki adatokat. Ha valami történik, kírja soros porton. Például ha összeáll a DSL kapcsolat, akkor "ADSL link up, interleaved, us=639, ds=12470" ha szétesik akkor pedig "ADSL link down"

Odáig eljutottam, ha jön az adat és talál benne "us=" részt, akkor az utána jövő 2 számértéket az UPSTREAM és a DOWNSTREAM változókba teszi és a DSLOK változót 1-re állítja.
Viszont bármikor megszakadhat, ezért folyamatosan kell figyelni, hogy van-e "down" szüvegrész. Ha igen, akkor az UPSTREAM , DOWNSTREAM értékeket nullázza és a DSLOK = 0.
Folyamatosan jönnek adatok a sorosportról viszonylag ritka időközönként, ha minden normális, viszont én onnan fogom lekérni majd az aktuális paramétereket (küldök soros porton parancsot és a modem válaszol, ebből kiszűröm ami nekem kell) de közben is megszakadhat a kapcsolat és közben is jön az "ADSL link down" információ.
Emiatt ennek a figyelésnek minden ciklusban le kellene futni szerintem. Gondoltam arra is, hogy egyszerűbb lennie a DSL LED-et figyelni, de az egy másik problémakör.

Az a problémám, hogy nem frissül az UPSTREAM és a DOWNSTREAM érték, akkor sem ha csatlakozott a modem. Amíg nem vizsgáltam a "down" szövegrészt addig működött.

Én erre az eljárásra gondoltam, amit akkor hív meg a főprogram, ha a modem üzemben van (van erre egy MODE változóm):

void dsl(){
if (mode == 2){
if (Serial.available() > 0) {
if (Serial.find("down")) DSLOK = 0;
if (Serial.find("up")) {
UPSTREAM = Serial.parseInt();
DOWNSTREAM = Serial.parseInt();
DSLOK = 1;
}
}
}
else DSLOK = 0;
}
Adamyno
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2015. április 16. csütörtök, 19:29

Re: Keresés soros port adatokból

Hozzászólás Szerző: Adamyno »

Ennyit változtattam, de nem segít:

Kód: Egész kijelölése

void dsl(){
  if ((mode == 2) && (DSLOK = 0)){
    if (Serial.available() > 0) {
      if (Serial.find("us=")) {
        UPSTREAM = Serial.parseInt();
        DOWNSTREAM = Serial.parseInt();
        DSLOK = 1;
      }
    }
  }
  else DSLOK = 0;
  if ((mode == 2) && (DSLOK = 1)){
    if (Serial.available() > 0) {
      if (Serial.find("down")) DSLOK = 0;
    }
  }
  
}
Adamyno
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2015. április 16. csütörtök, 19:29

Re: Keresés soros port adatokból

Hozzászólás Szerző: Adamyno »

Így már beállítja az UPSTREAM és a DOWNSTREAM értéket, viszont ha elküldöm neki a "down" szót, nem nullázza le a DSLOK változót.

Kód: Egész kijelölése

void dsl(){
  //if ((mode == 2) && (DSLOK = 0)) {
    if (Serial.available() > 0) {
      if (Serial.find("us=")) {
        UPSTREAM = Serial.parseInt();
        DOWNSTREAM = Serial.parseInt();
        DSLOK = 1;
       }
      else {
        if (Serial.find("down")) {
          DSLOK = 0;
        }  
      }
    }
}
Adamyno
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2015. április 16. csütörtök, 19:29

Re: Keresés soros port adatokból

Hozzászólás Szerző: Adamyno »

Így működik:

Kód: Egész kijelölése

void dsl(){
  switch (DSLOK) {
    case 0:
      if (Serial.available() > 0) {
        if (Serial.find("us=")) {
          UPSTREAM = Serial.parseInt();
          DOWNSTREAM = Serial.parseInt();
          DSLOK = 1;
         }
       }
       break;
     case 1:
       if (Serial.available() > 0) {
          if (Serial.find("down")) {
          UPSTREAM = 0;
          DOWNSTREAM = 0;
          DSLOK = 0;
          }
       }
      break;
    }
}
Válasz küldése