Umwandlung von 8bit zu 7bit

Schnelle objektorientierte, kompilierende Programmiersprache.
chris_1981_
Beiträge: 72
Registriert: Sa Jun 15, 2013 8:41 pm

Re: Umwandlung von 8bit zu 7bit

Beitrag von chris_1981_ » Mi Feb 19, 2014 10:33 pm

Hallo zusammen,

den sende_befehl habe ich nun wie aufgeführt aufgesetzt.

Code: Alles auswählen

int *sende_befehl ( int fd, char *string )
{
    int n = 0, str_bytes = 0;

    str_bytes = (sizeof(string)+2);

    printf ("String %s", string);

    n = write(fd, string, str_bytes);
    if (n < 0)
    {
        printf("write(%s) of %i bytes failed!\n",string, str_bytes);
        return 1;
    }
    else
    {
        return 0;
    }
}
das lesen und das initialisieren der Schnittstelle bereitet mir aktuell noch Probleme, aber es geht weiter.

chris_1981_
Beiträge: 72
Registriert: Sa Jun 15, 2013 8:41 pm

Re: Umwandlung von 8bit zu 7bit

Beitrag von chris_1981_ » Mi Feb 19, 2014 10:54 pm

Hallo zusammen,

Initialisierung der Schnittstelle geht nun auch:

Code: Alles auswählen

/*
 * 'open_port()' - Open serial port 1.
 *
 * Returns the file descriptor on success or -1 on error.
 */
int open_port(void)
{
    int fd; /* File descriptor for the port */

    struct termios options;

    fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NDELAY);
    fcntl(fd, F_SETFL, 0);

    /*
     * Get the current options for the port...
     */
    tcgetattr(fd, &options);

    /*
     * Set the baud rates to 19200...
     */
    cfsetispeed(&options, B19200);
    cfsetospeed(&options, B19200);

    options.c_cflag &= ~PARENB;
    options.c_cflag &= ~CSTOPB;
    options.c_cflag &= ~CSIZE;
    options.c_cflag |= CS8;
    options.c_oflag &= ~OPOST;
    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
    options.c_cflag &= ~CRTSCTS;

    /* set the options */
    //tcsetattr(fd, TCSANOW, &options);
    tcsetattr(fd, TCSAFLUSH, &options);

    if (fd == -1)
    {
        /*
         * Could not open the port.
         */
        perror("open_port: Unable to open /dev/ttyUSB0 - ");
        close(fd);
        return (-1);
    }
    else
    {
        fcntl(fd, F_SETFL, 0);
    }

    /*  !!!!!! FIXME !!!!!
     *   !!!!! MUST BE BUILD !!!!!
     * Check up connections to handy system
     * and restart the handy after three times of
     * check goes wrong. it not possible? of course, over the
     * hands-free device connection :-P
     * is all right, we set possible at settings 
     * after these tests we can wait / read for input 
     * from modem handy 
     */

     // { here comes the block

     // to check } 

    return (fd);
}

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Umwandlung von 8bit zu 7bit

Beitrag von mfro » Do Feb 20, 2014 7:26 am

chris_1981_ hat geschrieben: ..

Code: Alles auswählen

int *sende_befehl ( int fd, char *string )
{
...
    else
    {
        return 0;
    }
}
Das sieht komisch aus, da stimmt was nicht.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

chris_1981_
Beiträge: 72
Registriert: Sa Jun 15, 2013 8:41 pm

Re: Umwandlung von 8bit zu 7bit

Beitrag von chris_1981_ » Do Feb 20, 2014 8:51 pm

Hallo mfro,

<kopfkratz> was meint er denn?

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Umwandlung von 8bit zu 7bit

Beitrag von mfro » Do Feb 20, 2014 8:56 pm

chris_1981_ hat geschrieben:Hallo mfro,

<kopfkratz> was meint er denn?
was macht denn das Sternchen vor "sende_befehl()"? Das sieht zwar hübsch aus, gehört aber da nicht hin 8-)
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

chris_1981_
Beiträge: 72
Registriert: Sa Jun 15, 2013 8:41 pm

Re: Umwandlung von 8bit zu 7bit

Beitrag von chris_1981_ » Do Feb 20, 2014 8:58 pm

Ok, hast recht, ich übergebe ja auch keinen Pointer zurück.
Du wirst es nicht glauben, aber diese Korrektur habe ich vom Compiler schon vorgeschlagen bekommen und übernommen.

Entschuldigung.

chris_1981_
Beiträge: 72
Registriert: Sa Jun 15, 2013 8:41 pm

Re: Umwandlung von 8bit zu 7bit

Beitrag von chris_1981_ » Do Feb 20, 2014 10:37 pm

hallo mfro,

ich tue mich ein wenig schwer mit dem lesen der bytes.
Wenn ich die das (Aus-) Lesen der Schnittstelle durchführe mit folgenden Einstellungen:

Code: Alles auswählen

    options.c_cflag &= ~PARENB;
    options.c_cflag &= ~CSTOPB;
    options.c_cflag &= ~CSIZE;
    options.c_cflag |= CS8;
    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
    options.c_cflag &= ~CRTSCTS;
    /* set the options */
    tcsetattr(fd, TCSANOW, &options);
    //tcsetattr(fd, TCSAFLUSH, &options);
dann bekomme ich es aktuell nur schwer hin, die Daten zusammenhängend wieder zugeben:

Code: Alles auswählen

:

OK



OK



OK



OK



OK

:30
:
:1
:
R:2
:IN:2
:G
:2
:
:1
:

:2
:+C:2
:LI:2
:P::2
: :1
:+4:2
:91:2
:71:2
:77:2
:88:2
:99:2
:9,:2
:14:2
:5
:2
:
:1
der letzte Teil ist ein Anruf auf dem Handy.
Wahrscheinlich muss ich nun das CR und LF entfernen?
Oder sollte ich meine Schnittstellen Parameter auf folgende Einstellung setzen:

Code: Alles auswählen

    options.c_cflag &= ~PARENB;
    options.c_cflag &= ~CSTOPB;
    options.c_cflag &= ~CSIZE;
    options.c_cflag |= CS8;
    options.c_lflag |= (ICANON);  // Umstellung auf Line Data.
    options.c_cflag &= ~CRTSCTS;
    /* set the options */
    tcsetattr(fd, TCSANOW, &options);
    //tcsetattr(fd, TCSAFLUSH, &options);
Genau hier fehlt mir das Know.

Vielen Dank!

chris_1981_
Beiträge: 72
Registriert: Sa Jun 15, 2013 8:41 pm

Re: Umwandlung von 8bit zu 7bit

Beitrag von chris_1981_ » Do Feb 20, 2014 11:56 pm

Hallo,

mit entfernen der CR und LF kann ich den String den ich brauch auch lesen und verarbeiten.
Ab und an brauch ich halt etwas mehr Zeit.

Jetzt geht es weiter.

chris_1981_
Beiträge: 72
Registriert: Sa Jun 15, 2013 8:41 pm

Re: Umwandlung von 8bit zu 7bit

Beitrag von chris_1981_ » Fr Feb 21, 2014 1:34 am

hallo mfro,

ich dachte mir, auch wenn es schon spät ist, schreibe ich mal meine Ergebnisse auf:

Initialisierung der Schnittstelle:

Code: Alles auswählen

/*
 * 'open_port()' - Open serial port 1.
 *
 * Returns the file descriptor on success or -1 on error.
 */
int init_port(void)
{
    int fd; /* File descriptor for the port */

    struct termios options;

    fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK);
    fcntl(fd, F_SETFL, 0);

    /*
     * Get the current options for the port...
     */
    tcgetattr(fd, &options);

    /*
     * Set the baud rates to 19200...
     */
    cfsetispeed(&options, B19200);
    cfsetospeed(&options, B19200);

    options.c_cflag &= ~PARENB;
    options.c_cflag &= ~CSTOPB;
    options.c_cflag &= ~CSIZE;
    options.c_cflag |= CS8;
//    options.c_oflag &= ~OPOST;
    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
//    options.c_lflag |= (ICANON );
    options.c_cflag &= ~CRTSCTS;

    /* set the options */
    tcsetattr(fd, TCSANOW, &options);
    //tcsetattr(fd, TCSAFLUSH, &options);

    if (fd == -1)
    {
        /*
         * Could not open the port.
         */
        perror("open_port: Unable to open /dev/ttyUSB0 - ");
        close(fd);
        return (-1);
    }
    else
    {
        fcntl(fd, F_SETFL, 0);
    }

    /*  FIXME 
     * Check up connections!!
     * and start handy after three times of
     * check.
     * init modem squence for 
     * testing the connections
     * after these tests we can wait for input 
     * from modem handy 
     */


    return (fd);
}
Der Lese Befehl, der Korrektur bedürftig ist!

Code: Alles auswählen

char *lese_befehl ( int fd, char *string, char *string_ret )
{
    int i = 0, e = 0, bytes = 0, return_check = 0, res = 0;

    //while ( (ioctl(fd, FIONREAD, &bytes))  != 0 ) {} ;
    sleep(1);
    return_check = ioctl(fd, FIONREAD, &bytes);

    if ( return_check != -1 && bytes > 0 )
    {
        res=read(fd, string, bytes);
        string[res]=0;

        for(;;)
        {
            if(string[i] != '\n'  )
            {
                string_ret[e] = string[i];
                e++;
            }
            if(string[i] == '\0')
            {
                string_ret[e] = '\0';
                break;
            }
            i++;
        }
    }
    return string_ret;
}
hier der Sende Befehl der so aufgebaut ist:

Code: Alles auswählen

int sende_befehl ( int fd, char *string )
{
    int n = 0, str_bytes = 0;

    str_bytes = (sizeof(string)+2);

    n = write(fd, string, str_bytes);
    if (n < 0)
    {
        printf("write(%s) of %i bytes failed!\n",string, str_bytes);
        return 1;
    }
    else
    {
        return 0;
    }
}
Beim "Lese_Befehl" muss ich noch dran, das löschen der CR und LF sollte, denke ich, ausgelagert werden, ich kann solche Dinge auch für andere Funktionen auch nutzen.
Zusätzlich möchte ich gerne, ob das wirklich sinn macht sehe ich dann, dass der Lese_befehl "solange" wartet bis ein Zeichen im Register vorhanden ist, aktuell warte ich 1 Sekunde, das gefällt mir gar nicht, ich warte ja auf die Rückmeldung des Modems.

Ergebnis bei der Ausführung ist aktuell wie folgt:
Befehl: at<cr><lf>................Daten 1: atOK
Befehl: at+cvib=0<cr><lf>...Daten 2: at+cvib=0OK
Befehl: at^scid<cr><lf>........Daten 3: at^scid^SCID: 88773322552211117788OK
Es treten also noch ein paar Unstimmigkeiten auf, der Befehl wird quasi mit als lese_ergebnis übergeben, eventuell könnte man hier den AT-Befehl noch prüfen auf Korrektheit.
Zusätzlich fallen mir noch ein paar Fehler auf, bei gewissen AT Befehle wird dieser nicht komplett übermittelt, wahrscheinlich wegen dem sizeof(xxx) Parameter, dass muss ich mir heute Abend noch einmal anschauen und korrigieren.

Vielen Dank an dich mfro, ich hätte nicht gedacht, so weit zu kommen.
Natürlich auch mein danke an alle die mir Tipps gegeben und mich unterstützt haben.

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Umwandlung von 8bit zu 7bit

Beitrag von mfro » Fr Feb 21, 2014 7:37 am

Na also, siehste, geht doch ;). Prima.
chris_1981_ hat geschrieben: Es treten also noch ein paar Unstimmigkeiten auf, der Befehl wird quasi mit als lese_ergebnis übergeben,...
Das dürfte daran liegen, daß dein Telefon das Echo eingeschaltet hat. Schicke ein "ATE0" als einen der ersten Befehle, dann müsste das weg sein.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Antworten