1
0
Fork 0

Having the class destructor close the fd was a bad idea ... especially if you

ever make a copy of the instance and then subsequently destroy either.
close_port() is now a separate member function.
This commit is contained in:
curt 1998-11-30 17:15:29 +00:00
parent b82aef65e5
commit b4a913e339
2 changed files with 39 additions and 8 deletions

View file

@ -47,13 +47,20 @@ fgSERIAL::fgSERIAL(const string& device, int baud) {
} }
fgSERIAL::~fgSERIAL() { fgSERIAL::~fgSERIAL() {
close(fd); // closing the port here screws us up because if we would even so
// much as make a copy of an fgSERIAL object and then delete it,
// the file descriptor gets closed. Doh!!!
// close(fd);
} }
bool fgSERIAL::open_port(const string& device) { bool fgSERIAL::open_port(const string& device) {
struct termios config; struct termios config;
if ( (fd = open(device.c_str(), O_RDWR | O_NONBLOCK)) == -1 ) { fd = open(device.c_str(), O_RDWR | O_NONBLOCK);
cout << "Serial fd created = " << fd << endl;
if ( fd == -1 ) {
FG_LOG( FG_SERIAL, FG_ALERT, "Cannot open " << device FG_LOG( FG_SERIAL, FG_ALERT, "Cannot open " << device
<< " for serial I/O" ); << " for serial I/O" );
return false; return false;
@ -72,11 +79,13 @@ bool fgSERIAL::open_port(const string& device) {
// cout << "config.c_iflag = " << config.c_iflag << endl; // cout << "config.c_iflag = " << config.c_iflag << endl;
// software flow control on // software flow control on
// config.c_iflag |= IXON; config.c_iflag |= IXON;
// config.c_iflag |= IXOFF; config.c_iflag |= IXOFF;
// config.c_cflag |= CLOCAL;
// disable hardware flow control // disable hardware flow control
// config.c_cflag |= CRTSCTS; config.c_cflag &= ~(CRTSCTS);
// cout << "config.c_iflag = " << config.c_iflag << endl; // cout << "config.c_iflag = " << config.c_iflag << endl;
@ -88,6 +97,13 @@ bool fgSERIAL::open_port(const string& device) {
return true; return true;
} }
bool fgSERIAL::close_port() {
close(fd);
return true;
}
bool fgSERIAL::set_baud(int baud) { bool fgSERIAL::set_baud(int baud) {
struct termios config; struct termios config;
speed_t speed = B9600; speed_t speed = B9600;
@ -174,8 +190,13 @@ int fgSERIAL::write_port(const string& value) {
// cout << "write '" << value << "' " << count << " bytes" << endl; // cout << "write '" << value << "' " << count << " bytes" << endl;
if ( (int)count != (int)value.length() ) { if ( (int)count != (int)value.length() ) {
FG_LOG( FG_SERIAL, FG_ALERT, if ( errno == EAGAIN ) {
"Serial I/O on write, error number = " << errno ); // ok ... in our context we don't really care if we can't
// write a string, we'll just get it the next time around
} else {
FG_LOG( FG_SERIAL, FG_ALERT,
"Serial I/O on write, error number = " << errno );
}
} }
return count; return count;
@ -183,6 +204,11 @@ int fgSERIAL::write_port(const string& value) {
// $Log$ // $Log$
// Revision 1.6 1998/11/30 17:15:29 curt
// Having the class destructor close the fd was a bad idea ... especially if you
// ever make a copy of the instance and then subsequently destroy either.
// close_port() is now a separate member function.
//
// Revision 1.5 1998/11/25 01:33:23 curt // Revision 1.5 1998/11/25 01:33:23 curt
// Remove call to cfmakeraw() // Remove call to cfmakeraw()
// //

View file

@ -34,7 +34,7 @@
#include <string> #include <string>
// if someone know how to do this all with C++ streams let me know // if someone know how to do this all with C++ streams let me know
#include <stdio.h> // #include <stdio.h>
class fgSERIAL class fgSERIAL
@ -66,6 +66,11 @@ public:
// $Log$ // $Log$
// Revision 1.2 1998/11/30 17:15:30 curt
// Having the class destructor close the fd was a bad idea ... especially if you
// ever make a copy of the instance and then subsequently destroy either.
// close_port() is now a separate member function.
//
// Revision 1.1 1998/11/16 13:53:02 curt // Revision 1.1 1998/11/16 13:53:02 curt
// Initial revision. // Initial revision.
// //