Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com X-RAV-AntiVirus: This e-mail has been scanned for viruses on host: wg-ro-robe.inext.cz Date: Tue, 14 Oct 2003 08:07:44 +0200 From: Martin Farnik To: cygwin AT cygwin DOT com Subject: Re: tcflush hang problem Message-Id: <20031014080744.32a20a34.martin.farnik@email.cz> In-Reply-To: References: <20031013082714 DOT 77762606 DOT martin DOT farnik AT email DOT cz> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Thank for answer. I replace tcflush(fd,TCIFLUSH) by do { err = read(fd,iobuffer,1000) } while(err>0) and it work OK on Win98. I still have problem on Windows2000Sp2. It seem that it hangs in functions: tcsetattr(fd,TCSANOW,&newtio); read(fd,iobuffer,1000); write(fd,iobuffer,10); Strange thing is, that it hangs from my point of view randomly. Becase sometimes is operation successfully and other times it hangs (Windows:program is not responding). thank for help Marty > Cygwin's current tcflush implimentation is rather crude. Although, it may > not be possible to do any better. PTC. > > if (queue == TCIFLUSH || queue == TCIOFLUSH) > /* Input flushing by polling until nothing turns up > (we stop after 1000 chars anyway) */ > for (int max = 1000; max > 0; max--) > { > COMSTAT st; > if (!PurgeComm (get_handle (), PURGE_RXABORT | PURGE_RXCLEAR)) > break; > low_priority_sleep (100); > if (!ClearCommError (get_handle (), &ev, &st) || !st.cbInQue) > break; > } > > So, your not really hung. Just stuck for a long time. > > As a work around, tell the device to shut up first, then flush. > > On Mon, 13 Oct 2003, Martin Farnik wrote: > > > Hi. > > I use CYGWIN_98-4.10 mine 1.5.5(0.94/3/2) 2003-09-20 16:31 i686 uknown > > unknown Cygwin > > > > First i try to describe a situation: > > I have a device which is connected with computer thru serial line. > > Device is still sending data.These data isn't for my program.I have > > open com port and let them go into buffer . When a want to talk with > > device i flush input buffer, send it a command paket and device stop > > sending data and wait for my next command. > > Problem is when I want to flush INPUT buffer before I send a command. In > > this point it hangs, maybe for buffer full. > > Here is piece of code: > > > > -----I open port when i start program ----- > > > > fd = open(PORT0, O_RDWR | O_NOCTTY ); > > tcgetattr(fd,&oldtio); /* save current port settings */ > > > > bzero(&newtio, sizeof(newtio)); > > newtio.c_cflag = CS8 | CLOCAL | CREAD | CSTOPB; > > newtio.c_iflag = 0; > > newtio.c_oflag &= ~OPOST; > > newtio.c_lflag = 0; > > > > newtio.c_cc[VTIME] = 1; > > newtio.c_cc[VMIN] = 0; > > > > cfsetispeed(&newtio,B19200); > > cfsetospeed(&newtio,B19200); > > tcflush(fd, TCIFLUSH); > > tcsetattr(fd,TCSANOW,&newtio); > > ------------------------------------------------- > > --this code is execute when a want to talk with device---- > > > > tcflush(fd, TCIFLUSH); <--------- in this point where it hangs > > err = write (fd,iobuffer,10); > > > > -- > Brian Ford > Senior Realtime Software Engineer > VITAL - Visual Simulation Systems > FlightSafety International > Phone: 314-551-8460 > Fax: 314-551-8444 -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/