Serieller Port mit Glib::IOChannel
-
Hallo,
hat hier vielleicht jemand Ahnung von IOchannels?
http://developer.gnome.org/glibmm/unstable/classGlib_1_1IOChannel.html
Ich versuche mit einem Arduino zu kommunizieren, und das klappt auch erstaunlich gut
void Printer::serial_connect (string filename) { iochannel = Glib::IOChannel::create_from_file (filename, "a+"); iochannel->set_encoding (""); iochannel->set_buffered (true); iochannel->set_encoding ("UTF-8") ; Glib::signal_io().connect(sigc::mem_fun(*this, &Printer::iochannel_in), iochannel, Glib::IO_IN); }
bool Printer::iochannel_in(Glib::IOCondition cond) { ustring line; Glib::IOStatus status = iochannel->read_line(line); cerr << line; }
Das Problem ist nun, dass anscheinend immer das, was gerade mit read_line() eingelesen wurde, an den arduino zurückgeschickt wird und das in einer Endlosschleife landet.
D.h. ich bekomme Fehlermeldungen vom arduino, dass er sozusagen seine eigene Ausgabe als Befehl nicht versteht ...Vielleicht kommt ja so ein Problem jemandem bekannt vor ...?
Dazwischen liegt noch ein socat-socat link, aber das hat bisher mit der alten (termios...) Methode auch gut funktioniert, daran sollte/darf es nicht liegen.
echo:Unknown command:"onownnown command"
ok
echo:Unknown command:"nown"""ok"own nd"command"
ok
echo:Unknown command:""echo""
ok
echo:Unknown command:"mman"
ok
echo:Unknown command:"Unknown command"
ok
echo:Unknown command:"""okand"
ok
echo:Unknown command:""ecocommand"""
ok
echo:Unknown command:"ok"
ok
echo:Unknown command:"echok"
ok
echo:Unknown command:"command"
ok
echo:Unknown command:""echo""
ok
echo:Unknown command:"ok"
ok
echo:Unknown command:"eUnknown command"
ok
echo:Unknown command:""ok""
ok
-
dieses löst das Problem, allerdings wollte ich sowas eigentlich umgehen
device_fd = open(serialname, O_RDWR | O_NOCTTY | O_NDELAY); struct termios attribs; // Initialize attribs if(tcgetattr(device_fd, &attribs) < 0) { cerr << "error getting att" << endl; return; } cfmakeraw(&attribs); if(tcsetattr(device_fd, TCSANOW, &attribs) < 0) { cerr << "error setting att" << endl; return; } iochannel = IOChannel::create_from_fd (device_fd);