From: JimMH <jsk...@sb...> - 2011-10-27 16:42:09
|
I have a couple perl scripts to change settings on a matrix switch. Plan to do something similar in mh but one step at a time... If I run simple commands the program works (just write one setting and exit and have different scripts for different settings). When I try multiple commands it doesn't. I think buffering is the problemcombined with lack limited buffering in the matrix switch. The device does not use end of line character. The device does echo the characters so I could check for echo but simply flushing each command seems easier. I have seen some information on using $| = 1 so that each write command is sent by itself. Any example of applying that to a serial port? I think it requires the 'select' command. Or is there some other method preferred? I am using Device::SerialPort. -- View this message in context: http://old.nabble.com/Preferred-way-to-disable-serial-buffering--tp32732757p32732757.html Sent from the Misterhouse - User mailing list archive at Nabble.com. |
From: John <jo...@to...> - 2011-10-29 11:51:04
|
On 10/27/11 11:42, JimMH wrote: [snip] > Any example of applying that to a serial port? I think it requires the > 'select' command. > > Or is there some other method preferred? > > I am using Device::SerialPort. I use Device::SerialPort (via POE) to communicate with a radio scanner that is highly interactive and needs immediate response (short line are sent with return at end). Therefore, I assume that buffering is addressed with approach I used. However, I xopy/pasted this from an exmaple somewhere so can't say what part specifcally would. Init code: sub set_speed ($$) { my $fh = shift || die; my $speed = shift; my $termios = POSIX::Termios->new() || die; $termios->getattr(fileno($fh)) || die "$!"; eval("\$termios->setispeed(&POSIX::B$speed)") || die "$!"; eval("\$termios->setospeed(&POSIX::B$speed)") || die "$!"; $termios->setiflag( &POSIX::ICRNL ); $termios->setiflag( &POSIX::IGNBRK ); $termios->setlflag( &POSIX::ICANON ); $termios->setlflag( &POSIX::IEXTEN ); $termios->setoflag( &POSIX::OPOST ); $termios->setattr(fileno($fh), &POSIX::TCSANOW); } Also, I have this comment/code that was alo copy/pasted from another source. Yes, this is done after each command is sent to radio: # Clearing $! after $serial_port_wheel->put() seems to work around # an issue in Device::SerialPort 1.000_002. $! = 0; |
From: JimMH <jsk...@sb...> - 2011-10-31 17:53:37
|
Thanks, I did some checking and it isn't too much buffering after all. I inserted a delay between commands and everything now works fine. Doh! BTW, I think $| only has to be set once. What was unclear is how to make it apply to the serial port but I will leave that mystery for another day... -- View this message in context: http://old.nabble.com/Preferred-way-to-disable-serial-buffering--tp32732757p32754054.html Sent from the Misterhouse - User mailing list archive at Nabble.com. |