Ik heb een USB device gemaakt die een virtual compoort implementeert. Met een standaard compoort programma (ik gebruik kermit) kan ik dan interactief debuggen.

Voor "computer-interactie" met het ding wil ik een binary protocol implementeren: het gaat tzt op de performance aankomen.

De "standaard server" voor dit spul wil ik aanpassen om ook "mijn" protocol te gaan babbelen. Dat ding is geschreven in C++, waar ik niet zo heel veel ervaring mee heb.

Nu dacht ik: Ik open een fstream naar mijn seriele poort:

In het private deel van mij class:

    std::fstream mIOstream;

en dan:

    mIOstream.open ("/dev/ttyACM0");

Dan kan ik met:

    mIOstream  << "cmd\n";

een ouderwets commando sturen. Vervolgens een loopje om het antwoord af te wachten en voila! dat werkt!.

      while ( getline (mIOstream, line) ) {

Dat is voor initializatie en kan het bestaande ascii (debug) commando gebruiken.

Maar als ik dan een header voor een binary commando opbouw en met:

  mIOstream.write (header, sizeof(header));

probeer te schrijven, dan gaat de implementatie van "std::fstream:write" een fseek doen, hetgeen op mijn serieele poort kennelijk niet werkt. Duh!

Op "cout" kan ik wel gewoon write en << combineren zonder dat ie dan in de stress schiet omdat fseek niet werkt.

Wat doe ik verkeerd?

(Ik heb ondertussen als workaround de systeem open en write functies gebruikt, maar het zou mooier zijn om het op een C++ manier te blijven doen, toch?)

En als je de stream alleen in append mode opent?

-edit- Zoiets geloof ik:
mIOstream.open ("/dev/ttyACM0", fstream::app|fstream::out);

Misschien dat je ook nog fstream::binary moet toevoegen.

[Bericht gewijzigd door henri62 op (18%)]

Pas zojuist aan toegekomen om dit betrouwbaar te proberen.

Wat er dan gebeurt is dat ie meteen na het openen een SEEK probeert te doen, en dan werkt de iostream meteen al niet meer. :-(

8301  open("/dev/bw_ws2812", O_WRONLY|O_CREAT|O_APPEND, 0666) = 14
8301  lseek(14, 0, SEEK_END)            = -1 ESPIPE (Illegal seek)

UPDATE: het device 2x openen, 1x als ifstream, 1x als ofstream werkt. Wel moet ik dan expliciet een flush () op de ofstream doen voordat ik ga wachten op repies op de ifstream.

[Bericht gewijzigd door rew op (21%)]

Wat gebeurd er als je alleen fstream::out opgeeft?

Ik heb het ook niet op al die stream classes, een hoop bloat om gewone standaard libc functies. In dit geval totaal overbodig.

Misschien dat std::filebuf wel doet wat je wilt?

[Bericht gewijzigd door henri62 op (13%)]

Je bedoelt dat ik dan mogelijk maar 1 stream hoef te hebben? Ik kan het een keer proberen.

Ik gebruik voor communicatie default de asio library http://think-async.com/. Heeft ook ingebouwde support voor seriële poorten. Je kan ook de library met een filehandel laten werken (op windows gebruik ik dit om met een HID device te communiceren).

Ik raad je dan wel de C++11 (of hogere) versie aan. Bij oudere C++ versies moet je die boost::bind interface gebruiken en is niet zo clean en handig als de lambda support in C++11. Als je toch een oudere versie van C++ moet gebruiken installeer je best de boost library en gebruik dan de boost::asio versie http://www.boost.org/.