Forum: PC-Programmierung Einstellen der Baudrate eines seriellen Ports RS232 c_Linux


von Younes M. (younes)


Lesenswert?

Hallo zusammen,

Ich habe ein Stückcode geschrieben um einen seriellen Port zu öffnen, 
Daten zu schicken und anschliessen der Port zu schliessen.
Es funktioniet alles bis auf das Ein/Umstellen der Baudrate.

Laut mehre Docus und Toturien sollte die Baudrate wie folgt geaendert 
werden:

                  cfsetispeed(&options, B115200);
            0der: cfsetspeed(&options, B115200);
            Oder: cfsetospeed(&options, B115200);

Der Compiler meldet Erfolg. Nach Abfrage der aktuellen Baudrate per 
Terminal, stellt sich fest, dass die o. Methoden wirkungslos waren.
Es kommen zwar Daten an, diese sehen beim Eintreffen etwas exotischer 
aus als wie sie geschickt wurden.

Ich wäre für eure Hilfe sehr dankbar!!!!

Hier ist etwas Mehr Code:

int main(int argc, char *argv[])
{


   int OpenRet = OpenSerialPort(0);

   struct termios options;

   if (OpenRet != -1)
   {

     options.c_cflag &= ~PARENB;
     options.c_cflag &= ~CSTOPB;
     options.c_cflag &= ~CSIZE;
     options.c_cflag |= CS8;


         // folgende 3 Methode funktionieren weder einzeln noch zusammen
         cfsetispeed(&options, B115200);
         cfsetspeed(&options, B115200);
         cfsetospeed(&options, B115200);




     for (int j=0; j<100; j++)
     {
     int WriteRet = WriteOnSerialPort(OpenRet, 8);
     }

     CloseSerialPort(0);
    }



    cout << " \n Mainende erreicht \n" << endl;




  return EXIT_SUCCESS;
}

von g457 (Gast)


Lesenswert?

[quote]
   if (OpenRet != -1)
   {

     options.c_cflag &= ~PARENB;
     options.c_cflag &= ~CSTOPB;
     options.c_cflag &= ~CSIZE;
     options.c_cflag |= CS8;


         // folgende 3 Methode funktionieren weder einzeln noch zusammen
         cfsetispeed(&options, B115200);
         cfsetspeed(&options, B115200);
         cfsetospeed(&options, B115200);

     for (int j=0; j<100; j++)
     {
     int WriteRet = WriteOnSerialPort(OpenRet, 8);
     }
[/quote]
..da fehlt noch sowas wie tcgetattr() davor und tcsetattr danach :-)

von Younes M. (younes)


Angehängte Dateien:

Lesenswert?

Danke erstmal für die schnelle Antwort.
Ich habe die beiden Methoden hinzugefuegt. Das Ergebnis ist leider nach 
wie vor das selbe.
Info: Die Attribute c_ispeed c_ospeed wechslen ihre Werte von 15 auf 9 
im Laufe des Debuggens. Die Baudrate ändert sich jedoch nicht.

Auf weiteren Tipps würde ich mich freuen.

von g457 (Gast)


Lesenswert?

> int a= tcgetattr (0, &options); // 1. hinzugefuegte Funktion
                    ^
> a= tcsetattr(0,TCSANOW, &options); // 2. hinzugefuegte Funktion
               ^

FD 0 ist i.d.R. nicht wirklich die Serielle :-) Pack da mal den 
richtigen Deskriptor rein.

von Younes M. (younes)


Lesenswert?

Ich muss gestehen. Ich verstehe nicht was du meinst.

von Younes M. (younes)


Lesenswert?

Jetzt checke ich was du meinst.

Ich bin der Meinung, dass "fd" der Port entspricht.
In dem Fall Port 0 oder dev/ttyS0

von g457 (Gast)


Lesenswert?

Der Deskriptor, der da hingehört, das ist der, den Du von open() 
zurückbekommen hast, also sowas wie
1
int fd = open(..);
2
tcgetattr(fd, ..);

von Younes M. (younes)


Lesenswert?

Ich muss mein Kommentar zurück nehmen.
Du hast völlig recht.
 fd ist der Rückparameter von der open-Funktion.

Jetzt funktioniert!!

von Younes M. (younes)


Lesenswert?

besten Dank

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.