From: Joseph R L. <lif...@gm...> - 2007-05-08 04:33:00
|
I'm writing a C program for the gumstix to read/write to the serial port. I'm having trouble getting the correct flags on my serial object. I can write data out to the serial port but have been having trouble reading from it. I want to do a blocking read of a number of bytes. Here's what I'm doing right now: Opening a file descriptor with: _fd = ::open(_device.c_str(), O_RDWR | O_NOCTTY); if (_fd == -1) { #ifdef DEBUG cout << "Failed to open the serial port: " << _device.c_str() << endl; #endif _isOpen = false; } else { struct termios options; tcgetattr(_fd, &options); cfsetispeed(&options, B115200); cfsetospeed(&options, B115200); fcntl(_fd, F_SETFL, FNDELAY); options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB; options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; tcsetattr(_fd, TCSANOW, &options); } The to read from the serial port we have a Serial::read function that reads from the serial port and is supposed to return a std::string as seen below: // READ string Serial::read(size_t nbytes) { size_t n_read; char buf[124]; n_read =::read(_fd, buf, nbytes); string buf_string(buf, nbytes); return buf_string; }; The read function always returns a string with random charaters. Further more, it does not block for data. It seems like I'm using the wrong serial flags when I open the object. Ideas/comments or example code that works would be most appreciated. -- Sincerely, Joseph ~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~* Joseph R Lust (336) 575 8462 593 Mount Hope Avenue Rochester, NY, 14620 |
From: Dave H. <dhy...@gm...> - 2007-05-08 04:53:38
|
Hi Joseph, > struct termios options; > tcgetattr(_fd, &options); > cfsetispeed(&options, B115200); > cfsetospeed(&options, B115200); > fcntl(_fd, F_SETFL, FNDELAY); > options.c_cflag &= ~PARENB; > options.c_cflag &= ~CSTOPB; > options.c_cflag &= ~CSIZE; > options.c_cflag |= CS8; > tcsetattr(_fd, TCSANOW, &options); Look at VMIN and VTIME settings. http://www.unixwiz.net/techtips/termios-vmin-vtime.html -- Dave Hylands Vancouver, BC, Canada http://www.DaveHylands.com/ |