boost serial



  • Hi,
    ich versuche gerade, erstmals, ne serielle schnittstelle mit Boost zu realisieren..und scheitere.

    Was will ich hardwaretechnisch machen. Ich habe an meine serielle Schnittstelle einen PTT (PushToTalk) Taster angeschlossen und will dort regelmäßig den Status raushaben. Muutmaßlich muss eich einfach nur drauf nen Read machen. Also habe ich folgende einfache Methode bei google gefunden und und bei mir in ein testprogramm eingebunden...doch nichts geht.

    #include <boost/asio.hpp>
    
    using namespace boost;
    
    char read_char() {
        asio::io_service io;
        asio::serial_port port(io);
    
        port.open("COM3");
        port.set_option(asio::serial_port_base::baud_rate(115200));
    
        char c;
    
        // Read 1 character into c, this will block
        // forever if no character arrives.
        asio::read(port, asio::buffer(&c,1));
    
        port.close();
    
        return c;
    }
    

    die SW bleibt einfach bei "read" stehen, da kann ich auf den PTT drücken wie ich will.

    Help!

    mfg
    HH



  • Ich hatte ein ähnliches Problem. Allerdings ging es bei mir sobald ich die asynchronen Operationen verwendet habe. Für das feststellen eines PTT ist asynchron eh besser. Sobald du den PTT festgestellt hast kannst du den Rest der Übertragung immer noch synchron machen.

    Beispiel:

    #include <boost/asio.hpp>
    #include <boost/bind.hpp>
    
    using namespace boost;
    
    boost::array<char, 4096> ReadData;
    
    void asio_read_char() {
        asio::io_service io;
        asio::serial_port port(io);
    
        port.open("COM3");
        port.set_option(asio::serial_port_base::baud_rate(115200));
    
        port.async_read_some(boost::asio::buffer(c), boost::bind(HandlePTT, _1, _2));
    
        io.run();
    }
    
    void HandlePTT(boost::system::error_code error, std::size_t bytes_transferred){
        if(!error){
                    //Daten aus dem Read Array kopieren. Muss nicht unbedingt sein
    		char arrivedMsg[bytes_transferred];
    		for(int i = 0; i < bytes_transferred; i++){		
    			 arrivedMsg[i] += ReadData[i];
    		}
    
        }
        //Falls du dein PTT emfpangen hast, kannst du hier dann die synchronen Operationen starten.
    
    }
    

    Ich hab das aus einem meiner Projekte rausgenommen, es kann sein, dass es nicht direkt kompilierbar ist da es bei mir in einem Klassenkontext ausgeführt wird, sollte aber rüberbringen was ich meine



  • @Freddy: danke, werde ich gleichmal schaun.

    Ansonsten, in meiner "alten SW" wird der befehl GetCommModemStatus von Microsoft benutzt, um den PTT Status herauszubekommen.

    gibt es dafür eine Realisierung unter Boost?

    Denn ich habe nochmal gerade den Schaltplan angeschaut, mein PTT hat garkeinen Strom für eigene Logik sondern "nur" ne verkreuzung 2er Drähte im Seriellen

    https://cdn-reichelt.de/documents/datenblatt/C200/DS_2420_0101.pdf

    ich bin deshalb nicht sicher ob deine Lösung bei mir funktioniert. Aber ich versuche Sie mal schnell.



  • HeroHolger schrieb:

    @Freddy: danke, werde ich gleichmal schaun.

    Ansonsten, in meiner "alten SW" wird der befehl GetCommModemStatus von Microsoft benutzt, um den PTT Status herauszubekommen.

    gibt es dafür eine Realisierung unter Boost?

    Denn ich habe nochmal gerade den Schaltplan angeschaut, mein PTT hat garkeinen Strom für eigene Logik sondern "nur" ne verkreuzung 2er Drähte im Seriellen

    https://cdn-reichelt.de/documents/datenblatt/C200/DS_2420_0101.pdf

    ich bin deshalb nicht sicher ob deine Lösung bei mir funktioniert. Aber ich versuche Sie mal schnell.

    ich sehe die Schnittstelle zum Rechner leider im Moment nicht. Welches Signal sender der Taster an den seriellen port?



  • ...ist gescheitert.

    Er sendet laut serial Port Monitor ein DSR Signal



  • HeroHolger schrieb:

    ...ist gescheitert.

    Er sendet laut serial Port Monitor ein DSR Signal

    Das ändert die Sache. Das oben kann dann nicht funktionieren.

    Ich hab kurz drüber geschaut und ich sehe nicht direkt wie du mit boost::serial_port die Handshake leitungen abfragen kannst. Das ist noch ein level unter dem serial port. Da würd ich dir empfehlen bei Google nach dem Abfragen von RS232 Handshake leitungen zu suchen, das hab ich mit dem Rechner bisher nicht gemacht. Nach kurzer Suche hab ich gesehen dass das hier oft vorkam, vielleicht hilfts:

    http://www.codeproject.com/Articles/992/Serial-library-for-C

    Je nachdem was du am Ende erreichen willst, könntest du auch darüber nachdenken ob du einen TNC zwischen Rechner und Funkgerät (ich nehme an der PTT ist dafür da?) packst. Das ist normalerweise üblich. Der TNC übernimmt die vollständige Steuerung der Peripherie und der Rechner sendet nur noch was genau gemacht werden soll. So kannst du die Hardware nahen Probleme viel direkter lösen als mit dem PC.



  • wir entwickeln hier eine Communicationslösung mittels TCP/UDP. Und somit komme ich nicht daran vorbei, für sonen PTT selber nen Treiber zu schreiben.

    Aber danke für den Tipp..werde ich mir gleichmal anschauen.



  • ich hab bisher keine Boost-Lösung gefunden.

    Aber werde ich es heute mal hiermit versuchen:
    http://lists.boost.org/boost-users/2013/07/79343.php

    Was auf jeden Fall funktioniert ist das hier:

    http://www.teuniz.net/RS-232/

    schönes IF, easy 2 use.

    1A

    jetzt muss ich nur noch meine Kollegen überzeugen, dass die GPL2 Lizenz für uns geeignet ist.



  • schau dir das mal an:

    https://github.com/lbuchy/SerialPort
    

Anmelden zum Antworten