Näytä kirjoitukset

Tässä osiossa voit tarkastella kaikkia tämän jäsenen viestejä. Huomaa, että näet viestit vain niiltä alueilta, joihin sinulla on pääsy.


Viestit - Mistofelees

Sivuja: [1] 2 3 ... 30
1
Onkohan kenelläkään valmiina dokumentoitua ohjelmanpätkää, joka laskisi CRC-16 X-25 tarkistussumman?
(mieluiten C tai php, mutta muukin käy)

Olen nyt haaskannut muutamia tunteja katsellen netistä tälläistä, mutta kaikki ovat huonosti dokumentoituja. Ei mitään selitystä siitä, missä muodossa data pitäisi tajoilla ja missä muodossa se tulee ulos.
Dokumentoinnissa on myös unohdettu kertoa, onko CRC-16 CCIT:lle, Kermitille, X-25:lle ...

Netissä olleet selitykset itse laskenta-algoritmista ovat olleet kovasti risti-riitaisia. 

2
Lainaus
Python silti tällä hetkellä yksi käytönnöllisimmistä kielistä ja kehityy vain  :)
Olen tämän myös todennut käytännössä, mutta silti kaipaan noita sulkuja.
Tämä olisi aivan erilaista, jos työskentelisi vain yhdellä koneella ja isolla ruudulla
Kun hyppii koneelta toiselle ja vaihtaa editoria, tulee helposti  sekaannuksia.
Eräät editorit jopa poistavat oma-alotteisesti white-spaceja.
Olisivatpa sulut edes sallittuja, vaikkeivat olisikaan pakollisia.

3
En haluaisi siirtyä php:stä Pythoniin kesken projektia.
Sitäpaitsi inhoan Pythonia, koska siinä ei voi käyttää sulkuja ohjelman osien niputtamiseen. Pilattu hyvä ohjelmointikieli ylläpitäjän itsepäisyydellä.

4
Kyllästyin taistelemaan tuon kanssa ja kirjoitin php:llä scriptin, joka hoitaa homman nilkuttaen.
Scripti ei vielä osaa GT06:n kaipaamaa kättelyä, joten se kaataa yhteyden muutaman minuutin välein, jolloin myös ohjelma kaatuu.
Data kyllä tulee oikeassa muodossa ja tarkkuus on tarkastettu.

Kaikkea ei ehdi päivässä, kun pitää muutakin touhuta..

5
Laite (GT06 GPS tracker) lähettää binääristä dataa 30 sek välein n. 40 tavua kerrallaan.
Tämä data pitäisi saada kaapattua talteen ja muokattua seuraavan ohjelman käyttöön.
Saan datan tiedostoon loitsulla
Koodia: [Valitse]
[b]nc -kl 9998 |od -An -tu1 > /tmp/tracker.tmp[/b]
Nyt pitäisi vielä saada tuolle kaapatulle datalle tehtyä pari muokkausta ennenkuin seuraava ryöppy tulee.
- Ilmeisesti komentoriville ei pysty pipe:n perään lisäämään erillistä komentoa ? Ainakaan itse en onnistunut.
- Tein putken päähän bash scriptin, jossa on pari riviä. Tulkki ei kuitenkaan suostu suorittamaan, kuin ensimmäisen näistä riveistä
Koodia: [Valitse]
[b] #!/bin/bash
od -An -tu1 $1
echo "Hello"[/b]

Tuokin on outoa, että vaikka ohjaan datan tulostumaan tiedostoon '>', kirjoitus ei ala puhtaalta pöydältä, vaan ikäänkuin olisin käyttänyt '>>'.

Onko ajatuksia ?

6
Onko niin, että Linuxin omilla työkaluilla ei pysty käsittelemään I2C-piiriä, jossa on enemmän sisäisiä osoitteita, kuin 256 ?
Itse haluaisin käyttää EEPROM:a Raspberryssä.

Olen nyt pari viikkoa vääntänyt tämän kanssa ja viimein löytyi smbus:n dokumentti, jossa sanotaan, että osoite on 8-bittinen:
https://www.kernel.org/doc/Documentation/i2c/smbus-protocol
-" Comm  (8 bits): Command byte, a data byte which often selects a register on the device.
Data  (8 bits): A plain data byte. Sometimes, I write DataLow, DataHigh for 16 bit data.
Count (8 bits): A data byte containing the length of a block operation."

i2c-dev.h headerissa osoitteet on määritelty '__u8', mikä ilmeisesti tarkoittaa 8-bittistä osoitetta.

Kirjoittamalla osoitteen High-8 Comm-byteen ja Low-8 Datan ensimmäiseksi tavuksi sain jotain aikaan, mutta kokeilut ovat kesken ja toimivuus huono.

Olenkin ihmetellyt, miksi kaikki netissä olevat esimerkit ovat vain 256 tavulle, samaten kaikki kehutut apuohjelmat, joilla pitäisi hallita muistipiirejä, esim I2Ctools:n I2Ctransfer ja I2Cset

7
Väänsin C:llä kaksi ohjelmaa EEPROM:n komentamiseen. Kohteena FM24C64 FRAM muisti.
Toisella kirjoitetaan merkkijono EEPROM:lle ja toisella luetaan ja tyhjennetään.
Nämä ovat osa omaa GPS-tracker-rakennelmaa, eivätkä sinänsä täysin yleiskäyttöisiä, mutta ehkä niistä saa vinkkiä johonkin muuhun kehittelyyn, vaikkeivat kovin kaunista koodia olekaan.
Nämä toimivat ainakin omassa kokoonpanossani kuten pitääkin.

Paketissa on myös ohjelma GPS:n $GPRMC-lauseen lukemiseen, sekä 4-riviselle LCD:lle tulostamiseen.

KORJAUS:
Kuvittelin jo kaiken olevan hyvin, koska kaikki testit näyttivät vihreää.
I2C:n kirjoittamisessa löytyikin ongelma. ohjelma kirjoittaa kaiken ensimmäiselle 256 tavulle ja kiertyy aina alkuun.
Kirjoitusrutiini käyttää siis vain alempaa 8 bittiä osoitteessa.:
- Mikään ja yksikään netistä löytämäni ohjeet eivät kerro, miten EEPROM:lle kirjoitetaan, jos muistin koko on suurempi, kuin 256 tavua.

WiringPi ja OrangePi ovat parhaillaan tutkinnassa.
Tätä menoa kirjoitan kohta oman low-level-paketin, jolei muuta ratkaisua löydy.

Pidätelkää hengitystä ;(

8
Tämä on nyt pyörinyt 20 tuntia ongelmitta. En viitsi palauttaa edellistä tilannetta vain testauksen takia. Tämän kanssa on nyhrännyt niin monta päivää, että pitää jo päästä seuraavan projektin kimppuun.

9
Itsellä DDNS:n korvasi monet vuodet oma scripti, joka lähetti minulle sähköpostissa kodin uuden IP:n, jos ISP päätti muuttaa sitä.
Vieläkin se on varajärjestelmänä, mutta käytän silti pääosin kuitu-reitittimen valmistajan tarjoamaa DDNS:ää.
Oma http-sivusto on reitittimen DMZ:lla, josta ei ole pääsyä taloon sisälle. Taloon pääsee vain ssh:lla ja siinäkin on fail2ban koputtelijoiden kiusana.

10
Pistin C:n kiertämään ikuisuuskehää.
Ei tarvinnut tietokantaa, kun ohjelma tallettaa $GPRMC-lauseen tmpfs:llä olevaan tiedostoon ja pistää tiedoston pointterin heti takaisin rivin alkuun rewind-komennolla.
Tämä on nyt pyörinyt toistakymmmentä tuntia, vaikka nostin prosun nopeuttakin

Pistää miettimään, mihin kerneli kompastui, kun scripti kutsui C:llä kirjoitettua ohjelmaa toistuvasti tuhansia kertoja

Koodia: [Valitse]

  do{    // Ikuisuussilmukka:
    do {
      len=0;
      line[0]='\0';
      do{  // Luetaan lausetta portista. Max pituus 88mrk
        c=serialGetchar(usart);
        if ((35<c)&&(c<90)&&(len<88)){  // Rajataan merkistöä ja pituutta
           strncat(line, &c, 1);
           len++;
        }
        if (len>87){
           line[0]='\0'; len=0;   // Tuli roskarivi, liian pitäkä.
        } 
      }while(c!=10);       // Kierretään rivin loppuun asti:
    }while(strncmp("$GPRMC",line,6)!=0);     // Kierretään, kunnes on saatu $GPRMC-rivi haaviin:
    uline[0]='\0';       // Tyhjennetään array:
    memmove(uline, line+7, len); // $GPRMC pois lauseen alusta
    rewind(fout); // pointteri tiedoston alkuun. Tulostetaan samalle riville
    fputs(uline, fout);
  }while(1);   // Ikuisuussilmukka ei katkea normaalikeinoin, closet ovat turhat

11
Olen tässä yrittänyt keksiä tapoja rautavikojen selvittmiseen.
Pitää seuraavaksi siirtää /var/log tmpfs:ltä muistikortille. Useampiakin muistikortteja on jo kokeiltu.
Pitää myös tehdä dummy ohjelma, joka vaan kiertää kehää.

12
Tuota pitää varmaan kokeilla. En tosin tietokantojen kanssa, vaan vaikka normaalin lineaarisen tiedoston.
Kokeilinkin jo sitä, että gps tulosti suoraan tiedostoon tmpfs:llä ja se tuntui toimivan hyvin, joten siirryin käyttämään wait komentoa.

Systeemi kaatui taas hetki sitte, joten wait ei auttanut. Sattumalta llaite oli töllössä kiinni ja sain kaapattua kameralla virheilmoituksen:
-"INFO: rcu_sched detected stalls on CPUs/tasks"
Kuukkeli kertoi, että tämä saattaa olla kernelin ongelmia:

Linux-image-current-sunxi=21.08.2,  5.10.60-sunxi
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.2 LTS"

Koneena on Orange Pi Lite, joten jakeluna on Armbian 21.08.1

13
Nuo eivät ole ympäristömuuttujia, vaan bash scriptin muuttujia, jotka annetaan syötteinä tuolle C-kieliselle ohjelmalle.
Jos tuon haluaisi ajaa suoraan komentoriviltä, pitäisi tietenkin antaa muuttujille ensin arvoja.

En kyllä väitä, että ympäristömuuttujatkaan olisivat aivan hanskassa, koska en yleensä tarvitse kuin muutamia.

Tuo systeemin crashi kyllä ihmetyttää. Se ei ilmeisesti voi johtua pid:n ylivuodostakaan. Eiköhän Linux sentään osaa pyöräyttää pid:n takaisin nollille, kun yläraja tulee vastaan ?

Sain juuri kaapattua kameralla virheilmoituksen, joka kuitenkin oli niin kryptinen, että menee hetki, ennenkuin pääsen sitä purkamaan.

14
Olen kirjoitellut ohjelmistopakettia, joka veneessä ja matkailuautossa kerää esim paikkatietoa, esittää sen paikallisesti kulkuneuvon serverin omilla nettisivuilla ja lähettää kotiserverille. Vekottimessa on näyttölaitteena 4x20 I2C LCD.

Data lähetetään LCD:lle omatekoisella C-kielisellä ohjelmalla (  ./LCDtulosta clr "$D $T UTC"@1,1 "LAT: $lat"@2,1 "LON: $lon"@3,1 )
GPS:ää luetaan omatekoisella C-kielisellä ohjelmalla, joka printtaa $GPRMC -lauseen.

Sitten alkoivat ongelmat.
Systeemi kaatui ja kone meni jumiin epäsäännöllisesti 5min - 12h ajon jälkeen. BASH:n rajallisilla työkaluilla syyn löytäminen oli todella hankalaa.
Epäilin jo muistikortteja, prosessoria ja virtalähdettäkin.

Tämä auttoi hieman, tällä pääsi näkemään, missä kone kaatui:
trap 'echo "Vika rivillä $LINENO" >> /home/bin/i2cLCD/testi.txt' ERR
samaten pitkin scriptiä sirotellut echo "Ax">>/home/bin/i2cLCD/testi.txt -lauseet

'timeout' GPS:ää kutsuvalla rivillä auttoi selviämään GPS:n jumeista

Lopullinen ratkaisu suorastaan hävettää.
- Pistetään GPS työntämään tulostuksensa tiedostoon (tiedosto tietenkin tmpfs:llä !)
- Ajetaan C-ohjelmia taustalla ('&'), jotta niistä saadaan puristettua PID
- Pistetään scripti odottamaan GPS-ohjelman kypsymistä
- Haetaan tiedostosta rivi ja jatketaan

Kaikkine roskineenkin scriptin pyörähdykseen menee n. 2 sek, joten LCD:lle tulostuskin voidaan pistää taustalle '&'. I2C LCD:n ruudun täyttämiseen menee n. 1 sek.

Scripti ja C-ohjelmat itsessään ovat niin pitkät, etten viitsi niitä pistää tähän, mutta tässä on tarjolla mekanismi, jolla GPS:n lukeminen tuntuu onnistuvan
Koodia: [Valitse]
      timeout 3 /home/bin/i2cLCD/gps >$TMPFILE &
      pid=$!
      wait $pid
      read uline < $TMPFILE

Seuraava murhe on siinä, mitä tapahtuu, kun PID:n arvo kasvaa yli naapurin aidan. Osaako systeemi aloittaa PID-laskurin nollasta, vai tuleeko overflow ?

15
Kiitos !

Bash on niin täynnä omituisia koukeroita, että olen usein toivonut, että m$ ja *n?x olisivat ottaneet komentotulkiksi  Basic:n.
TAI että olisin itse ottanut aikojen alussa csh:n käyttöön.
Nyt ei viitsisi enää vaihtaa, koska servereillä ja pöytäkoneissa on jo satoja bash:lla kirjoitettuja scriptejä.

16

En löydä mistään tietoa C:n kielletyista komentoriviargumenteista.
'$' argumentin ensimmäisenä merkkinä ei toimi.
Jos '$' on keskellä sanaa, se ja loppusana katoavat

Onko joku temppu, jolla C:n saisi hyväksymään dollarimerkin komentorivillä ?
'$GPRMC ' on selkeämpi parametri, kuin 'GPRMC'


17
Kiitos. Mielenkiintoista päästä tutkimaan Pythonilla kirjoitettua koodia, Siitä on akaa, kun viimeksi olen Pythonia käyttänyt.
Tämä C lähti liikkeelle siiitä, kun kirjoitin OrangePi:lle C-pätkän, joka tulostaa suoraan 4-riviselle I2C LCD-näytölle. Tuli himo kokeilla C:tä muutenkin.

18
Kiitos korjauksesta. Käänsin ja pistin kestotestiin.
Itselleni C on vieras kieli.

10 min ajon aikana tuli neljä timeout:a ja sitten koko kone meni jumiin, eikä vastaa mihinkään. Ei edes ping tai ssh.
IVO-boot auttaa.

Vika ei ole tekemässäsi korjauksessa, vaan jossain muualla järjestelmässä.
Tämä kone ei muuten jumittele, mutta tämä sarjaportin luku on sille liikaa.

Tässä on itsellä sellainen ongelma, että käyttämäni GPS-moduli sylkee satunnaisesti röykkiöittäin roskaa.
Moduli olisi muuten nepea ja tarkka, joten en viitsisi luopua

Mielestäni pistin tälle palstalle toisen version ohjelmasta. Siinä sarjaporttia luetaan merkki kerrallaan. Sitä ei nyt kuitenkaan näy missään.

19
Tuota timeouttia olen kasvatellut eri tavoin.
Tässä on tuon C-kielisen osan sorsat

Koodia: [Valitse]
#define TERMINAL    "/dev/ttyS2"
#define FALSE 0
#define TRUE !(FALSE)

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
/**********************/
int set_interface_attribs(int fd, int speed){
    struct termios tty;
    if (tcgetattr(fd, &tty) < 0) {
        printf("Error from tcgetattr: %s\n", strerror(errno));
        return -1;
    }
    cfsetospeed(&tty, (speed_t)speed);
    cfsetispeed(&tty, (speed_t)speed);

    tty.c_cflag |= (CLOCAL | CREAD);    /* ignore modem controls */
    tty.c_cflag &= ~CSIZE;
    tty.c_cflag |= CS8;         /* 8-bit characters */
    tty.c_cflag &= ~PARENB;     /* no parity bit */
    tty.c_cflag &= ~CSTOPB;     /* only need 1 stop bit */
    tty.c_cflag &= ~CRTSCTS;    /* no hardware flowcontrol */

    /* setup for non-canonical mode */
    tty.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);
    tty.c_lflag &= ~(ECHO | ECHONL | ISIG | IEXTEN);
    tty.c_oflag &= ~OPOST;

    /* fetch bytes as they become available */
    tty.c_cc[VMIN] = 50;
    tty.c_cc[VTIME] = 3;

    if (tcsetattr(fd, TCSANOW, &tty) != 0) {
        printf("Error from tcsetattr: %s\n", strerror(errno));
        return -1;
    }
    return 0;
}
int main(){
    char *port = TERMINAL;
    int fd;
    unsigned char c;
    unsigned char line[120];
    unsigned char temp[120];
    unsigned char jatkuu=1;
    unsigned int len;

    fd=open("/dev/ttyS2",O_RDONLY);
    if (fd < 0) {
        printf("Error opening %s: %s\n", port, strerror(errno));
        return -1;
    }
    /*baudrate 9600, 8 bits, no parity, 1 stop bit */
    set_interface_attribs(fd, B9600);
    do {
        len = read(fd, &line, sizeof(line));
            if(strncmp("$GPRMC",line,5)==0){
                jatkuu=0;
                // Leikataan alusta 7 merkkiä ja lopusta 8 merkkiä:
                memmove(temp, line + 7, len -7-5 + 1);
                printf("LEN=%d %s\n",len,temp);
            }
       
    } while (jatkuu);
    close(fd);
}

20
Kirjoitin Bash:lla kevyen scriptin, joka kutsuu toistuvasti C:llä kirjoitettua ohjelmaa 'GPS'
'GPS lukee sarjaportissa olevan GPS:n lähettämää tekstivirtaa, poimii siitä $GPRMC-lauseen, tulostaa sen ja poistuu.

Scripti pyörii 5 - 20 kierrosta. jonka jälkeen se jämähtää.
Vika on kirjoittamassani 'GPS'-ohjelmassa ja tarkemmin sen lukulauseessa
int n = read(fd, &line, sizeof(line));

Onko jotain tapaa, millä näkisi, mikä on vikana ? muistin ylivuotoja, tms

Olen kirjoittanut tuon GPS ainakin sata kertaa uudestaan eri rakenteilla

Scripti on vain testausta varten:
Koodia: [Valitse]
#!/bin/bash
lkm=0
while true; do
   ./gps;   lkm=$((lkm+1));   echo "lkm=$lkm"
done

Sivuja: [1] 2 3 ... 30