Gå til innhold

Sceptic

Medlemmer
  • Innlegg

    272
  • Ble med

  • Besøkte siden sist

Innlegg skrevet av Sceptic

  1. Tja, ser vel mer komplisert ut enn det det er pga. kommentarene som bryter inn mellom koden antar jeg.

    Her er deler av koden uten kommentarer:

    
    // Ekstrakt telefonnr.
    for (i = 0; i<11; i++)
      sendernr[i] = smsbuffer[7+i];
    
    Koden over er bare en enkel for løkke som kopierer data fra en buffer til en annen.

     

    
    // Ekstrakt melding
      for (i = 0, j = 0; i <= MAX_SMS_SIZE; i++) {
        if (smsbuffer[i] == 0x0a) {
          i++;
          while (smsbuffer[i] != 0 && i <= MAX_SMS_SIZE)  {
            meldingsbuf[j++] = smsbuffer[i++];
          }
          break;
        }
        if (i == MAX_SMS_SIZE)
          Serial.println("Fant ingen melding\n");
      }
    
    Koden over her er kanskje litt mer innvolvert da vi må finne starten av meldingen, men selve kopieringen er bare en variant av den forrige kodesnutten (while istedenfor for).

     

    Prøvde du å kjøre koden?

     

    Sceptic

  2. Her er ett eksempel på hvordan man kan ekstrahere informasjon fra en streng.

    
    #include <string.h>
    
    //#define  MAX_SMS_SIZE  160  // Funker ikke
    
    void setup() {
      
      Serial.begin(115200);
      Serial.print("Starting up...\n");
      delay(1000);
    }
    
    void loop() {
    
      int i, j;
      static const int MAX_SMS_SIZE = 160;
      
      char smsbuffer[] = "+CMT: \"+4722222222\",\"\",\"14/0/0,19:19:23+0\"\n\rPassword led";
      char sendernr[12];
      char meldingsbuf[MAX_SMS_SIZE];
      
      memset(sendernr, 0, sizeof(sendernr));  //Initialiser buffer med 0
      memset(meldingsbuf, 0, sizeof(meldingsbuf));  //Initialiser buffer med 0
      
      Serial.print("Før kopiering av chars...\n");
      Serial.print("smsbuffer = ");
      Serial.println(smsbuffer);
      Serial.print("sendernr = ");
      Serial.println(sendernr);  // Inneholder ingenting
      Serial.print("meldingsbuf = ");
      Serial.println(meldingsbuf);  // Inneholder ingenting
      
      // Ekstrakt telefonnr.
      for (i = 0; i<11; i++)  // Kopier 11 bytes fra smsbuffer (offset 7) over til sendernr-buffer og
        sendernr[i] = smsbuffer[7+i];  // la den 12te byte'n være 0 slik at strengen blir nullterminert
    
      // Ekstrakt melding
      for (i = 0, j = 0; i <= MAX_SMS_SIZE; i++) {
        if (smsbuffer[i] == 0x0a) {  //Meldingen begynner rett etter LINEFEED
          i++;  // Ikke kopier LF
          while (smsbuffer[i] != 0 && i <= MAX_SMS_SIZE)  {  // Iterer til vi er på slutten av strengen eller maks antall tegn i sms      
            meldingsbuf[j++] = smsbuffer[i++];  // Kopier meldingen til meldingsbuffer
          }      
          break;  // Ingen vits å kjøre igjennom hele smsbuffer når meldingen er funnet og kopiert
        }
        if (i == MAX_SMS_SIZE)
          Serial.println("Fant ingen melding\n");
      }    
    
      Serial.print("\nEtter kopiering av chars...\n");
      Serial.print("smsbuffer = ");
      Serial.println(smsbuffer);
      Serial.print("sendernr = ");
      Serial.println(sendernr);
      Serial.print("meldingsbuf = ");
      Serial.println(meldingsbuf);
      
      while (1) {};
    }
    Med forbehold om mulige bugs =)

     

    Jeg antar at formatet er det samme hver gang du mottar en sms, derav

     

    
    sendernr[i] = smsbuffer[7+i];
    hvor 7 er den 8nde byte'n i strengen (vi starter å telle fra null i for løkka).

     

    Merk at koden over ikke tar hensyn til andre lands tlf.nr. enn norges (og de land som tilfeldigvis har samme antall siffre i sitt nummere).

    Hvis man f.eks tekster fra en mobil registrert på Hawaii, så vil landskoden være 1808 + x antall siffre og lengden på tlf.nr. vil sannsymligvis være forskjellig fra den norske.

    En mulig løsning vil være å starte og kopiere fra byte 8 og iterere til man møter gåseøyne etter selve tlf.nr. i strengen.

     

    For å ekstrahere selve meldingen må vi bruke en annen løsninig, da jeg kan se for meg at antall tegn for dato og tidssone kan variere.

    F.eks:

    
    +CMT: "+47********","","14/0/0,19:19:23+0"<CR><LF>Melding
    kontra

    
    +CMT: "+xx(xx)********","??","14/10/11,19:19:23+11"<CR><LF>Melding
    
    derfor søker vi etter LINEFEED som er den siste char før selve meldingen.

     

    Håper dette hjelper.

     

    Sceptic

  3. Hei,

     

    Det hadde vært fint om du kunne spesifisere modellen nærmere.

    Er den gammel?

     

     

    Hva sier Fn + Fx? Vanligvis på bærbare er det en funksjonstast man kan (de)aktivere wifi med.

    Eller er det en fysisk bryter (vanlig før) på en av sidene av maskinen som står i feil posisjon?

     

    Ellers kan du prøve å oppdatere/reinstallere driverene for nettverkskortet.

     

    Sceptic

  4. Hei, koden varierer litt nå på grunn av testing.

    Jeg tester en og en del av koder og tester noen teorier før jeg setter det sammen til en kode.

     

    Prosjektet går ut på GPS tracking av hund, men muligheter til andre oppgaver også.

    Spenningsmålingen er for at programmet kan se at spenningen på halsbandet blir for lavt og gir deg beskjed via sms, du kan og spørre etter batteri spenningen via sms.

    SD kortet er et alternativ for de som ønsker å bruke halsbandet til tur logging og ikke kun gps tracking av hunden. Den kan og f.eks få i oppgave og logge hundens prosisjon hver time, en gang om dagen osv.

     

     

    Utstyr i bruk nå:

    SIM900 skaffet jeg fra ebay - SIM900 GSM

    GPS enheten skaffet jeg fra adafruit - Ultimate GPS

    SD kort enheten skaffet jeg fra adafruit - MicroSD

    Alt er styrt via:

    Arduino Mega2560 - Mega2560

    eller

    Arduino DUE - DUE

     

    Jeg valgte disse komponentene på grunn av pris og god levering. Adafruit er ganske rask og veldig hjelpsome så det er vert å ta en titt der.

     

     

    Driver fortsatt med tester og for å få litt valg muligheter ser det ut som jeg kommer til å bruke DUE kortet på grunn av multitaskingen.

    Skal også endre mye av kodingen som sitter i SRAM til å bli flyttet over til Flash, dette er for å spare plass på SRAM som jeg trenger.

    Hei igjen

     

    Takker så mye for hintet for alternativ for hvor jeg kan skaffe SIM900-shield'et og DUE kortet skal også anskaffes, mest pga. DAC-funksjonalieten.

    Har selv både et UNO kort og et Mega2560 + et ethernet-shield som jeg kjøpte i fjor en gang.

    Desverre så har jeg ikke fått puslet så mye med dette enda, men fikk en ny giv når jeg kom over denne tråden.

     

    Interessant prosjekt forresten. Håper du får det til.

     

    Sceptic

  5. Hei Kimlorentz,

    Jeg har fulgt litt med på tråden her og er interessert i å anskaffe SIM900-modulen.

    Er denne å få kjøpt i norge eller skaffet du den via epalsite?

     

    Et annet spørsmål: Kan du beskrive bedre hva det er du prøver å oppnå med prosjektet ditt?

    Etter det jeg ser av koden du har lagt ut til nå, så varierer det veldig med hvilke komponenter du tar i bruk (GSM/GPRS, spenningsmåler, SD-kort, GPS).

    Skal du bruke alle komponentene i prosjektet ditt eller er det bare en måte å teste ut forskjellige teorier/metoder på?

     

    Sceptic

  6. CastleLord,

    Du må åpne et kommandovindu for å kjøre programmet.

     

    Hvis du har lastet ned og pakket ut filene på desktop'en, prøv:

     

    C:\dokumenter og innstillinger\bruker\skrivebord>movefile c:\brukere\markus\mine bilder\stuff\fil_som_skal_slettes.type ""

     

    deretter restarter du PC'en.

     

    Sceptic

  7. Ok, på menyen øverst, klikk på Applications/Accessories/Terminal

     

    I terminalen skriv: lspci | grep Ethernet

    Det vil da eventuellt komme opp en linje noe ala dette her: 00:04.0 Ethernet controller: nVidia Corporation nForce2 Ethernet Controller (rev a1)

     

    Du kan også prøve: lspci -vv

    for mer info om pcienhetene i systemet ditt (du må muligens scrolle litt opp for å se info om Ethernet kontrolleren.

     

    Dette er for å se om kontrolleren er 'oppdaget' av Ubuntu/systemet.

     

    Hvis det dukker opp en kontroller, gå til System/Preference/Network connections

     

    I Network connections' wired-fane står det normalt 'Auto eth0', klikk på denne og så Edit

    I Editing dialogen skal Connect automatically være huket av.

    Under IPv4Setting-fanen, sett Method til Automatic (DHCP) og klikk Apply

     

    Eller hvis du har et symbol med pil opp og ned på meny-linja, høyreklikk på denne og aktiver nettverket.

     

    Sceptic

  8. Du trenger ikke bruke PIC på x86, det kommer bare til å gi deg en haug med trøbbel.

    Nå var vel dette bare et eksempel på hvordan man 'oversetter' MOVE X(PC), D0 til x86, men jeg er enig, dette er skikkelig nasty programmering.

    Hvis du putter inn x istedet for 0500h i eksempelet til Sceptic blir det ihvertfall feil.

    Det kommer vel an på hva du vil med koden, eller hva?

     

    Eksempel med variabel:

    MOV    EAX, EIP        ;spar ip (pc)
    ADD    EAX, [X]        ;kalkuler adresse (ip + 07ffh) 
    MOV    EBX, [EAX]      ;legg innholdet av adressen i eax til ebx
    .
    .
    .
    X    DW    07ffh

    Sceptic

  9. D0 er bare et data-register. X86:

    MOV eax, dword [X]

    Du har rett i at D0 er et dataregister, men resten er feil.

     

    MOVE X(PC), D0 instruksjonen flytter innholdet av (PC) + X inn i D0.

     

    Ta f.eks:

     

    $1000 MOVE.W    $500(PC), D0;

     

    I og med at PC (eller ip i x86 verden) peker på neste instruksjon, så er PC lik $1002.

    Legg til $500 og man ender opp med adresse $1502.

    Hvis adresse $1502 inneholder 0xbeef, så blir resultatet i D0 0xbeef.

     

    Noe lignende i pseudo x86:

    MOV    EAX, EIP        ;spar ip (pc)
    ADD    EAX, 0500h        ;kalkuler adresse
    MOV    EBX, [EAX]        ;legg innholdet av adressen i eax til ebx

     

    Sceptic

  10. Win95 har så vidt jeg vet ikke noe innebygget program som kan kommunisere på com-port.

    Så vidt jeg vet så kom win95 med Hyperterminal.

     

    Sceptic

    Ja men kan du overføre filer med det?

    Javisst kan du det!

    Brukte Hyperterminalen i Win98 i fjor sommer da jeg fikk tak i en gammel laptop(IBM TP760ED) som jeg ville eksperimentere med, men den var uten USB og nettverksport.

    Før jeg fikk tak i et PCMCIA nettverkskort, brukte jeg HT til å overføre div diagnoseprogrammer etc. via com-porten.

    Som nevnt tidligere i tråden så tar det litt tid med overføring av filer pga den begrensede hastigheten på com-porten, men har man viktige data å redde f.eks, så driter man i hvor lang tid det tar :)

     

    Sceptic

×
×
  • Opprett ny...