Avatar billede rasmus_skovsen Nybegynder
21. august 2006 - 23:14 Der er 3 kommentarer

brug af date i C

Jeg er igang med at lave en opgave, hvori vi skal modtage en masse data på den serielle kanal, faktisk kommer der en pakke ind hvert 10 milisekund, og jeg skal lave et timestamp på hver af pakkerne, inden jeg gemmer dem.

Jeg havde planlagt at bruge " date +%y%m%e%H%M%S%N%t " som er en native linux commando, jeg skal bruge værdierne som YYMMDDHHmmss og milisekunder til sidst, altså alt i alt 15 tegn.

Men hvordan indsætter jeg dem i min kode ?

Gode råd modtages gerne :-)

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
#include <time.h>

#define BAUDRATE B38400
int conv[13];
int x,y;
char buf[40];

int main() {
    int fd, ret;
    struct termios newtio; // struct til seriel portens parametre (baud rate, paritets bit.....)
    FILE *fp=NULL;
    int counter=0, i=1;
    char str[20];
    // system("clear");

    fd = open("/dev/tts/1",  O_RDWR | O_NOCTTY);

    if(fd < 0)  {
        printf("Unable to connect");
        close(fd);
        exit(0);
    }

    printf("\nconnected\n");

    bzero(&newtio, sizeof(newtio));

    newtio.c_cflag = BAUDRATE |  CRTSCTS |  CS8 |  CLOCAL |  CREAD;

    newtio.c_iflag = IGNPAR |  ICRNL;

    newtio.c_oflag = 0;

    newtio.c_lflag = ICANON;

    tcflush(fd, TCIFLUSH);
    tcsetattr(fd, TCSANOW, &newtio);


    sprintf(str, "data/%d", i);

    while(1) {
      //  printf("\nVenter på data\n");
        ret = read(fd, buf, 40);
        buf[ret] = '\n';

      // printf("\nbuf: %s, ret: %d\n", buf, ret);
            if(ret == 27 && buf[0] == '0' && buf[25] == '3') {
          fp = fopen(str, "a");

            if(fp == NULL) printf("\nunable to open file");
                x=0;
                for(y=0; y<26; y++)
                {
                conv[y]=0;
                if(buf[x] > 57 )
                        conv[y]=(buf[x]-55)<<4;
                else
                        conv[y]=(buf[x]-48)<<4;
                x++;
                if(buf[x] > 57 )
                        conv[y]=conv[y]|(buf[x]-55);
                else
                        conv[y]=conv[y]|(buf[x]-48);
                x++;
                }

            fprintf(fp, "%03d%03d%03d%03d%03d%03d%03d%03d%03d%03d%03d%03d%03d\r\n",
                        conv[0],conv[1],conv[2],conv[3],conv[4],conv[5],conv[6],conv[7],conv[8],conv[9],conv[10],conv[11],con
v[12]);
            fclose(fp);
            counter++;
            if(counter == 20) {
              counter = 0;
              sprintf(str, "data/%d", ++i);

          }
      }
    }

    close(fd);
}


som det er nu, komm der en pakke ind i asci HEX, de konverteres til heltal, og gemmes derefter.
Jeg ønsker at kunne gemme "date strengen" umiddelbart efter min datapakke.
Avatar billede arne_v Ekspert
21. august 2006 - 23:21 #1
gettimeofday returnerer en struct timeval
som indeholder en normal time_t (der kan konverteres til en struct tm)
og antal millionte dele sekunder
Avatar billede rasmus_skovsen Nybegynder
21. august 2006 - 23:46 #2
Takker :-)
Det vil jeg kigge nærmere på i morgen tidlig, har stiret mig rigligt blind her i dag ;)
Avatar billede arne_v Ekspert
30. september 2006 - 21:14 #3
all set ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester