Toon posts:

RS232 C++ probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zou graag een voltcraft meter uitlezen type : vc506. Deze stuurt data terug in de volgende vorm:

AC 023.3 mV

Het probleem is dat deze string eindigd met een '/r'. Dus de fucntie getline werkt niet, omdat die wacht op een '/n'.

Weet er iemand een oplossing?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 07:54
Even het gedrag van getline() herschrijven in je eigen functie, door steeds een enkele character te lezen (of beter nog, gebruik te maken van een buffer). Is niet zo moeilijk, lijkt me?

Verwijderd

code:
1
2
3
4
5
6
7
#include <string>

std::string voltage;

while(std::getline(std::cin, voltage, '\r')) {
  ...
}

Verwijderd

Topicstarter
code:
1
getline()

mag toch maar 2 parameters meekrijgen...

Dit is de functie om een "line" te lezen..
code:
1
2
3
4
5
6
7
void RS232Lib::readLine(char *buf) 
{
    ifstream i(naam); 
    string s; 
    getline(i, s);
    strcpy(buf, s.c_str()); 
}

Verwijderd

Op maandag 17 juni 2002 13:16 schreef ber2002 het volgende:
code:
1
getline()

mag toch maar 2 parameters meekrijgen...
Nee :)
code:
1
2
template <class charT, class traits, class Allocator> istream&
getline (istream&, basic_string <charT, traits, Allocator>&, charT delim = '\n');

Verwijderd

Topicstarter
hmmm. Interessant,

Toch blijft ie nog hangen op de getline...

Hij komt er niet voorbij.

nu is ie dus zo :
code:
1
2
3
4
5
6
7
void RS232Lib::readLine(char *buf) 
{
    ifstream i(naam); 
    string s; 
    getline(i, s, '\n');
    strcpy(buf, s.c_str()); 
}

Verwijderd

Als je nu die '\n' in je code verandert in '\r'... :)

Offtopic, maar ik raad je aan geen C en C++ strings te mixen, dat werkt bugs in de hand. Gebruik dus std::string& ipv. char*.

Verwijderd

Topicstarter
ok, na een beetje nieuwe info ingewonnen te hebben, blijkt het geen '\n' of '\r' te zijn, maar een "pijltje naar links" (27)...

wat nu???

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 07:54
Op maandag 17 juni 2002 13:04 schreef ber2002 het volgende:
Het probleem is dat deze string eindigd met een '/r'. Dus de fucntie getline werkt niet, omdat die wacht op een '/n'.
Op maandag 17 juni 2002 13:26 schreef ber2002 het volgende:
Toch blijft ie nog hangen op de getline...
[..]
getline(i, s, '\n');

Verwijderd

Op maandag 17 juni 2002 13:29 schreef ber2002 het volgende:
ok, na een beetje nieuwe info ingewonnen te hebben, blijkt het geen '\n' of '\r' te zijn, maar een "pijltje naar links" (27)...

wat nu???
std::getline(std::cin, voltage, 27);

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 07:54
Op maandag 17 juni 2002 13:29 schreef ber2002 het volgende:
ok, na een beetje nieuwe info ingewonnen te hebben, blijkt het geen '\n' of '\r' te zijn, maar een "pijltje naar links" (27)...

wat nu???
Ik zit te trillen op m'n stoel van frustratie.

LEES NOU GEWOON DE SUGGESTIES! PROBEER ZE EERST TE BEGRIJPEN VOODAT JE WEER KOMT BLATEN!

Zo. * Soultaker vindt z'n zelfbeheersing terug.

Verwijderd

Topicstarter
code:
1
2
3
4
5
$ QCC -o test Main.cpp RS232AcquisitionSystem.cpp RS232Lib.cpp Voltcraft.cpp
RS232Lib.cpp: In method `void RS232Lib::readLine(char *)':
RS232Lib.cpp:240: no matching function for call to `getline (std::ifstream &, st
d::string &, int)'
cc: /usr/lib/gcc-lib/ntox86/2.95.2/cc1plus error 33

Ik mag blijkbaar geen "int" meegeven

Verwijderd

Op maandag 17 juni 2002 13:31 schreef Soultaker het volgende:
Ik zit te trillen op m'n stoel van frustratie.

LEES NOU GEWOON DE SUGGESTIES! PROBEER ZE EERST TE BEGRIJPEN VOODAT JE WEER KOMT BLATEN!

Zo. * Soultaker vindt z'n zelfbeheersing terug.
relax ;)

na voldoende herhaling wordt het patroon wel duidelijk :+

Verwijderd

Op maandag 17 juni 2002 13:33 schreef ber2002 het volgende:
Ik mag blijkbaar geen "int" meegeven
Oeps, mijn vaut. Eerst ff naar een char casten:

std::getline(std::cin, voltage, static_cast<char>(27));

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 07:54
Op maandag 17 juni 2002 13:33 schreef ber2002 het volgende:
Ik mag blijkbaar geen "int" meegeven
Zou best kunnen dat QCC een andere STL heeft. Wat is 't prototype van readline?
Op maandag 17 juni 2002 13:35 schreef mietje het volgende:
relax ;)

na voldoende herhaling wordt het patroon wel duidelijk :+
Vast wel, maar dat is nauwelijks een goede instelling om mee te leren programmeren. ;(

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 05-09 23:13

johnwoo

3S-GTE

Op maandag 17 juni 2002 13:33 schreef ber2002 het volgende:
code:
1
2
3
4
5
$ QCC -o test Main.cpp RS232AcquisitionSystem.cpp RS232Lib.cpp Voltcraft.cpp
RS232Lib.cpp: In method `void RS232Lib::readLine(char *)':
RS232Lib.cpp:240: no matching function for call to `getline (std::ifstream &, st
d::string &, int)'
cc: /usr/lib/gcc-lib/ntox86/2.95.2/cc1plus error 33

Ik mag blijkbaar geen "int" meegeven
std::getline(std::cin, voltage, (char) 27); misschien?

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 00:27
De getline() oplossingen die gegeven zijn werken (als je de moeite neemt om er twee seconden over na te denken), maar zijn niet de meest nette. De nette oplossing is om het binary formaat van de filebuf (ifstream::rdbuf() ) te converteren naar text, en daarbij de \x1B te vervangen door een \n, dmv een filtering streambuf

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Op maandag 17 juni 2002 13:39 schreef MSalters het volgende:
De nette oplossing is om het binary formaat van de filebuf (ifstream::rdbuf() ) te converteren naar text, en daarbij de \x1B te vervangen door een \n, dmv een filtering streambuf
Purist. :) Er zit niet voor niets een specificeerbare delimiter in getline... Dit is een oplossing die je ongeveer 2 seconden kost; het schrijven en debuggen van een filtering streambuf duurt wel iets langer.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 00:27
Op maandag 17 juni 2002 13:44 schreef mietje het volgende:

[..]

Purist. :) Er zit niet voor niets een specificeerbare delimiter in getline... Dit is een oplossing die je ongeveer 2 seconden kost; het schrijven en debuggen van een filtering streambuf duurt wel iets langer.
Ja - krijg jij niet per uur betaald ? :P

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1