Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Advanced Developers Conference     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: C++ (auch C++0x und C++11) ::  Boost Serielle Schnittstelle  
Gehen Sie zu Seite Zurück  1, 2
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
theta
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.09.2008
Beiträge: 3648
Beitrag theta Mitglied 22:38:38 11.03.2010   Titel:              Zitieren

Aha, und auch da gibts kein Problem, oder?
Markus W.
Unregistrierter




Beitrag Markus W. Unregistrierter 23:01:54 11.03.2010   Titel:              Zitieren

Naja ich finde es halt recht unübersichtlich jedes mal wenn ich die Schnittstelle wo brauche so etwas schreiben zu müssen:

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
        serialPort.open("\\\\.\\COM1");

        serialPort.set_option(serial_port::baud_rate(9600));
        serialPort.set_option(serial_port::parity(serial_port::parity::none));
        serialPort.set_option(serial_port::character_size(serial_port::character_size(8)));
        serialPort.set_option(serial_port::stop_bits(serial_port::stop_bits::one));
        serialPort.set_option(serial_port::flow_control(serial_port::flow_control::none));

        std::string s = "test";
        serialPort.write_some(buffer(s));

        serialPort.close();
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
serialPort.open("\\\\.\\COM1");

serialPort.set_option(serial_port::baud_rate(9600));
serialPort.set_option(serial_port::parity(serial_port::parity::none));
serialPort.set_option(serial_port::character_size(serial_port::character_size(8)));
serialPort.set_option(serial_port::stop_bits(serial_port::stop_bits::one));
serialPort.set_option(serial_port::flow_control(serial_port::flow_control::none));

std::string s = "test";
serialPort.write_some(buffer(s));

serialPort.close();
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
        serialPort.open("\\\\.\\COM1");

        serialPort.set_option(serial_port::baud_rate(9600));
        serialPort.set_option(serial_port::parity(serial_port::parity::none));
        serialPort.set_option(serial_port::character_size(serial_port::character_size(8)));
        serialPort.set_option(serial_port::stop_bits(serial_port::stop_bits::one));
        serialPort.set_option(serial_port::flow_control(serial_port::flow_control::none));

        std::string s = "test";
        serialPort.write_some(buffer(s));

        serialPort.close();


Zumal mir nicht gefällt, dass man um die Optionen zu setzen die Schnittstelle erst öffnen muss. Das fand ich bei .Net besser gelöst.

com->set...;
com->open();
com->send(...);
com->close(...);
branleb
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.05.2005
Beiträge: 566
Beitrag branleb Mitglied 23:41:03 11.03.2010   Titel:              Zitieren

Wenn dir die API nicht passt, such dir eine andere...

Aber zum eigentlichen Problem:
Verpack die Port Steuerung in eine eigene Port Klasse für dich.
Kannst die Boostklasse ja als Basisklasse nehmen - oder als Member, auf dem du die Operationen ausführst. Dann musst du die optionen nicht "immer wieder" setzen.
Setzen musst du sie, weil hier eben auch andere Werte möglich wären. Ich weis ja nicht, wie .Net das macht, wenn du ne andere Baudrate nutzen willst.

_________________
Don't hate the Hacker. Hate the Code!
Markus W.
Unregistrierter




Beitrag Markus W. Unregistrierter 23:49:15 25.03.2010   Titel:              Zitieren

So ich habe jetzt mal versucht davon eine Klasse abzuleiten:

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef SERIALPORT_H
#define
    SERIALPORT_H
#include
<boost/asio.hpp>
#include
<string>

class SerialPort :public boost::asio::serial_port {
public:
    SerialPort();
    void set_name(const std::string &new_name) {name=new_name;}
    void set_baudrate(int new_baudrate) {baudrate=new_baudrate;}
    void open();
    void write(const std::string &text);

private:
    int baudrate;
    std::string name;
    boost::asio::io_service ioService;

};

#endif
    /* SERIALPORT_H */
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef SERIALPORT_H
#define
SERIALPORT_H
#include
<boost/asio.hpp>
#include
<string>

class SerialPort :public boost::asio::serial_port {
public:
SerialPort();
void set_name(const std::string &new_name) {name=new_name;}
void set_baudrate(int new_baudrate) {baudrate=new_baudrate;}
void open();
void write(const std::string &text);

private:
int baudrate;
std::string name;
boost::asio::io_service ioService;

};

#endif
/* SERIALPORT_H */
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef SERIALPORT_H
#define
    SERIALPORT_H
#include
<boost/asio.hpp>
#include
<string>

class SerialPort :public boost::asio::serial_port {
public:
    SerialPort();
    void set_name(const std::string &new_name) {name=new_name;}
    void set_baudrate(int new_baudrate) {baudrate=new_baudrate;}
    void open();
    void write(const std::string &text);

private:
    int baudrate;
    std::string name;
    boost::asio::io_service ioService;

};

#endif
    /* SERIALPORT_H */


C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "SerialPort.h"

SerialPort::SerialPort():boost::asio::serial_port(ioService) {

}

void SerialPort::open() {
    boost::asio::serial_port::open(name);
    boost::asio::serial_port::set_option(boost::asio::serial_port::baud_rate(baudrate));
    boost::asio::serial_port::set_option(boost::asio::serial_port::parity(boost::asio::serial_port::parity::none));
    boost::asio::serial_port::set_option(boost::asio::serial_port::character_size(boost::asio::serial_port::character_size(8)));
    boost::asio::serial_port::set_option(boost::asio::serial_port::stop_bits(boost::asio::serial_port::stop_bits::one));
    boost::asio::serial_port::set_option(boost::asio::serial_port::flow_control(boost::asio::serial_port::flow_control::none));
}

void SerialPort::write(const std::string &text) {
    boost::asio::serial_port::write_some(boost::asio::buffer(text));
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "SerialPort.h"

SerialPort::SerialPort():boost::asio::serial_port(ioService) {

}

void SerialPort::open() {
boost::asio::serial_port::open(name);
boost::asio::serial_port::set_option(boost::asio::serial_port::baud_rate(baudrate));
boost::asio::serial_port::set_option(boost::asio::serial_port::parity(boost::asio::serial_port::parity::none));
boost::asio::serial_port::set_option(boost::asio::serial_port::character_size(boost::asio::serial_port::character_size(8)));
boost::asio::serial_port::set_option(boost::asio::serial_port::stop_bits(boost::asio::serial_port::stop_bits::one));
boost::asio::serial_port::set_option(boost::asio::serial_port::flow_control(boost::asio::serial_port::flow_control::none));
}

void SerialPort::write(const std::string &text) {
boost::asio::serial_port::write_some(boost::asio::buffer(text));
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "SerialPort.h"

SerialPort::SerialPort():boost::asio::serial_port(ioService) {

}

void SerialPort::open() {
    boost::asio::serial_port::open(name);
    boost::asio::serial_port::set_option(boost::asio::serial_port::baud_rate(baudrate));
    boost::asio::serial_port::set_option(boost::asio::serial_port::parity(boost::asio::serial_port::parity::none));
    boost::asio::serial_port::set_option(boost::asio::serial_port::character_size(boost::asio::serial_port::character_size(8)));
    boost::asio::serial_port::set_option(boost::asio::serial_port::stop_bits(boost::asio::serial_port::stop_bits::one));
    boost::asio::serial_port::set_option(boost::asio::serial_port::flow_control(boost::asio::serial_port::flow_control::none));
}

void SerialPort::write(const std::string &text) {
    boost::asio::serial_port::write_some(boost::asio::buffer(text));
}


mit folgendem Ergebnis, beim Objekt anlegen:
Code:
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >'
  what():  mutex: Invalid argument
Code:
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >'
what(): mutex: Invalid argument
Code:
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >'
  what():  mutex: Invalid argument


Der Fehler muss also schon im Konstruktor liegen. Ich versuche das Basisobjekt mit dem IoService zu Initialisieren. Das müsste doch eigentlich funktionieren, oder etwa nicht?
theta
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.09.2008
Beiträge: 3648
Beitrag theta Mitglied 09:13:51 26.03.2010   Titel:              Zitieren

1. Warum leitest Du ab? Warum nicht einfach eine Komposition / Aggregation?
2. Das ioService Objekt ist noch nicht konstruiert wenn es an den Konstruktor der Basis Klasse (serial_port) übergeben wird.

BTW: Ev. gefällt Dir diese Implementation besser (sie ist sehr zu empfehlen):
http://www.codeproject.com/KB/system/serial.aspx

Simon
Markus W.
Unregistrierter




Beitrag Markus W. Unregistrierter 10:58:53 26.03.2010   Titel:              Zitieren

Meinst du eher so:

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef SERIALPORT_H
#define
    SERIALPORT_H
#include
<boost/asio.hpp>
#include
<string>

class SerialPort{
public:
    SerialPort();
    ~SerialPort();
    void set_name(const std::string &new_name) {name=new_name;}
    void set_baudrate(int new_baudrate) {baudrate=new_baudrate;}

private:
    int baudrate;
    std::string name;
    boost::asio::io_service *ioService;
    boost::asio::serial_port *serialPort;

};

#endif
    /* SERIALPORT_H */
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef SERIALPORT_H
#define
SERIALPORT_H
#include
<boost/asio.hpp>
#include
<string>

class SerialPort{
public:
SerialPort();
~SerialPort();
void set_name(const std::string &new_name) {name=new_name;}
void set_baudrate(int new_baudrate) {baudrate=new_baudrate;}

private:
int baudrate;
std::string name;
boost::asio::io_service *ioService;
boost::asio::serial_port *serialPort;

};

#endif
/* SERIALPORT_H */
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef SERIALPORT_H
#define
    SERIALPORT_H
#include
<boost/asio.hpp>
#include
<string>

class SerialPort{
public:
    SerialPort();
    ~SerialPort();
    void set_name(const std::string &new_name) {name=new_name;}
    void set_baudrate(int new_baudrate) {baudrate=new_baudrate;}

private:
    int baudrate;
    std::string name;
    boost::asio::io_service *ioService;
    boost::asio::serial_port *serialPort;

};

#endif
    /* SERIALPORT_H */

C/C++ Code:
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
#include "SerialPort.h"

SerialPort::SerialPort():ioService(new boost::asio::io_service), serialPort(new boost::asio::serial_port(*ioService)){
}

SerialPort::~SerialPort() {
    delete serialPort;
    delete ioService;
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
#include "SerialPort.h"

SerialPort::SerialPort():ioService(new boost::asio::io_service), serialPort(new boost::asio::serial_port(*ioService)){
}

SerialPort::~SerialPort() {
delete serialPort;
delete ioService;
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
#include "SerialPort.h"

SerialPort::SerialPort():ioService(new boost::asio::io_service), serialPort(new boost::asio::serial_port(*ioService)){
}

SerialPort::~SerialPort() {
    delete serialPort;
    delete ioService;
}


Dazu noch mal ein paar Fragen.
Ich habe das jetzt mit Dynamischen Objekten gemacht. Mit statischen habe ich es nciht hin bekommen. Sind Statische Objekte in der Verwendung besser als Dynamische?

Die von dir genannte Lib läuft leider nur unter Windows.
theta
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.09.2008
Beiträge: 3648
Beitrag theta Mitglied 11:11:48 26.03.2010   Titel:              Zitieren

Zitat:
Sind Statische Objekte in der Verwendung besser als Dynamische?

Kann man nicht generell sagen.

Edit:
Ja, ich meinte eher so (keine Vererbung mehr).

Simon


Zuletzt bearbeitet von theta am 11:12:36 26.03.2010, insgesamt 1-mal bearbeitet
Markus W.
Unregistrierter




Beitrag Markus W. Unregistrierter 11:33:56 26.03.2010   Titel:              Zitieren

so hier die aktuelle Implementation:
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "SerialPort.h"

SerialPort::SerialPort()
    :ioService(new boost::asio::io_service), serialPort(new boost::asio::serial_port(*ioService)),baudrate(0),name(""){
}

SerialPort::~SerialPort() {
    delete serialPort;
    delete ioService;
}

void SerialPort::open() {
    if(name=="" && baudrate==0) {
        throw "Kein Portname angegeben und keine Baudrate definiert!";
    }else if(name=="") {
        throw "Kein Portname angegeben!";
    } else if(baudrate==0) {
        throw "Keine Baudrate definiert!";
    }
    serialPort->open(name);
    serialPort->set_option(boost::asio::serial_port::baud_rate(baudrate));
    serialPort->set_option(boost::asio::serial_port::parity(boost::asio::serial_port::parity::none));
    serialPort->set_option(boost::asio::serial_port::character_size(boost::asio::serial_port::character_size(8)));
    serialPort->set_option(boost::asio::serial_port::stop_bits(boost::asio::serial_port::stop_bits::one));
    serialPort->set_option(boost::asio::serial_port::flow_control(boost::asio::serial_port::flow_control::none));
}

void SerialPort::close() {
    serialPort->close();
}

void SerialPort::write(const std::string &text) {
    serialPort->write_some(boost::asio::buffer(text));
}

void SerialPort::set_name(const std::string& new_name) {
    if(serialPort->is_open()) {
        throw "Port " + name + " ist geöffnet";
    }
    name=new_name;
}

void SerialPort::set_baudrate(int new_baudrate) {
    if(isOpen()) {
        serialPort->set_option(boost::asio::serial_port::baud_rate(new_baudrate));
        baudrate=new_baudrate;
    } else {
        baudrate=new_baudrate;
    }
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "SerialPort.h"

SerialPort::SerialPort()
:ioService(new boost::asio::io_service), serialPort(new boost::asio::serial_port(*ioService)),baudrate(0),name(""){
}

SerialPort::~SerialPort() {
delete serialPort;
delete ioService;
}

void SerialPort::open() {
if(name=="" && baudrate==0) {
throw "Kein Portname angegeben und keine Baudrate definiert!";
}else if(name=="") {
throw "Kein Portname angegeben!";
} else if(baudrate==0) {
throw "Keine Baudrate definiert!";
}
serialPort->open(name);
serialPort->set_option(boost::asio::serial_port::baud_rate(baudrate));
serialPort->set_option(boost::asio::serial_port::parity(boost::asio::serial_port::parity::none));
serialPort->set_option(boost::asio::serial_port::character_size(boost::asio::serial_port::character_size(8)));
serialPort->set_option(boost::asio::serial_port::stop_bits(boost::asio::serial_port::stop_bits::one));
serialPort->set_option(boost::asio::serial_port::flow_control(boost::asio::serial_port::flow_control::none));
}

void SerialPort::close() {
serialPort->close();
}

void SerialPort::write(const std::string &text) {
serialPort->write_some(boost::asio::buffer(text));
}

void SerialPort::set_name(const std::string& new_name) {
if(serialPort->is_open()) {
throw "Port " + name + " ist geöffnet";
}
name=new_name;
}

void SerialPort::set_baudrate(int new_baudrate) {
if(isOpen()) {
serialPort->set_option(boost::asio::serial_port::baud_rate(new_baudrate));
baudrate=new_baudrate;
} else {
baudrate=new_baudrate;
}
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "SerialPort.h"

SerialPort::SerialPort()
    :ioService(new boost::asio::io_service), serialPort(new boost::asio::serial_port(*ioService)),baudrate(0),name(""){
}

SerialPort::~SerialPort() {
    delete serialPort;
    delete ioService;
}

void SerialPort::open() {
    if(name=="" && baudrate==0) {
        throw "Kein Portname angegeben und keine Baudrate definiert!";
    }else if(name=="") {
        throw "Kein Portname angegeben!";
    } else if(baudrate==0) {
        throw "Keine Baudrate definiert!";
    }
    serialPort->open(name);
    serialPort->set_option(boost::asio::serial_port::baud_rate(baudrate));
    serialPort->set_option(boost::asio::serial_port::parity(boost::asio::serial_port::parity::none));
    serialPort->set_option(boost::asio::serial_port::character_size(boost::asio::serial_port::character_size(8)));
    serialPort->set_option(boost::asio::serial_port::stop_bits(boost::asio::serial_port::stop_bits::one));
    serialPort->set_option(boost::asio::serial_port::flow_control(boost::asio::serial_port::flow_control::none));
}

void SerialPort::close() {
    serialPort->close();
}

void SerialPort::write(const std::string &text) {
    serialPort->write_some(boost::asio::buffer(text));
}

void SerialPort::set_name(const std::string& new_name) {
    if(serialPort->is_open()) {
        throw "Port " + name + " ist geöffnet";
    }
    name=new_name;
}

void SerialPort::set_baudrate(int new_baudrate) {
    if(isOpen()) {
        serialPort->set_option(boost::asio::serial_port::baud_rate(new_baudrate));
        baudrate=new_baudrate;
    } else {
        baudrate=new_baudrate;
    }
}



Kann man da noch was verbessern. Was jetzt noch fehlt ist die Read Implementierung. Ich würde das lesen in einen neuen Thread auslagern. Aber wie kann ich da am besten überprüfen, ob neue Bytes da sind, außer alle so und so viele ms zu lesen und gucken, ob was da ist?
Markus W.
Unregistrierter




Beitrag Markus W. Unregistrierter 16:19:28 26.03.2010   Titel:              Zitieren

Hier ist was zum Daten Lesen.
http://lists.boost.org/boost-users/2009/04/46978.php

Das kann man anscheinend gut in einen Thread auslagern. Nur sehe ich bei dem Code noch nciht so richtig durch. Wie die Buffer etc. gehandhabt werden.
C/C++ Forum :: C++ (auch C++0x und C++11) ::  Boost Serielle Schnittstelle  
Gehen Sie zu Seite Zurück  1, 2
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.