From: Angel P. <ang...@ya...> - 2009-09-26 09:01:55
|
Hi, I am trying to read from serial port on windows using http://downloads.sourceforge.net/project/clisp/clisp/2.48/clisp-2.48-win32-mingw-big.exe. The problem is that read-char-no-hang-p hangs when there is no data on serial interface. sample session is: CL-USER> (defvar com (open "COM3" :direction :io)) COM CL-USER> com #<IO UNBUFFERED FILE-STREAM CHARACTER #P"COM3" @1> CL-USER> (format com "at~%") NIL CL-USER> (read-char-will-hang-p com) NIL CL-USER> (read-char com) #\a CL-USER> (read-char-will-hang-p com) NIL CL-USER> (read-char com) #\t CL-USER> (read-char-will-hang-p com) NIL CL-USER> (read-char com) #\Newline CL-USER> (read-char-will-hang-p com) NIL CL-USER> (read-char com) #\Newline CL-USER> (read-char-will-hang-p com) NIL CL-USER> (read-char com) #\O CL-USER> (read-char-will-hang-p com) NIL CL-USER> (read-char com) #\K CL-USER> (read-char-will-hang-p com) NIL CL-USER> (read-char com) #\Newline CL-USER> (read-char-will-hang-p com) - Hang Regards, AngelP |
From: Pascal J. B. <pj...@in...> - 2009-09-26 11:53:09
|
On Sep 26, 2009, at 11:01 AM, Angel Popov wrote: > Hi, > I am trying to read from serial port on windows using > http://downloads.sourceforge.net/project/clisp/clisp/2.48/clisp-2.48-win32-mingw-big.exe > . > The problem is that read-char-no-hang-p hangs when there is no data > on serial interface. > > sample session is: > CL-USER> (defvar com (open "COM3" :direction :io)) Try with: :buffered nil -- __Pascal Bourguignon__ http://www.informatimago.com |
From: Angel P. <ang...@ya...> - 2009-09-26 14:02:59
|
Thanks, I have tried [1]> (defvar com (open "COM3" :direction :io :buffered nil)) COM [2]> (read-char-will-hang com) but hanged again --- On Sat, 9/26/09, Pascal J. Bourguignon <pj...@in...> wrote: > From: Pascal J. Bourguignon <pj...@in...> > Subject: Re: [clisp-list] read-char-no-hang-p hangs on com port > To: "Angel Popov" <ang...@ya...> > Cc: cli...@li... > Date: Saturday, September 26, 2009, 2:52 PM > > On Sep 26, 2009, at 11:01 AM, Angel Popov wrote: > > > Hi, > > I am trying to read from serial port on windows using > > http://downloads.sourceforge.net/project/clisp/clisp/2.48/clisp-2.48-win32-mingw-big.exe. > > The problem is that read-char-no-hang-p hangs when > there is no data on serial interface. > > > > sample session is: > > CL-USER> (defvar com (open "COM3" :direction :io)) > > Try with: > :buffered nil > > > --__Pascal Bourguignon__ > http://www.informatimago.com > > > > |
From: Jonathan J. <fra...@gm...> - 2009-09-27 00:42:48
|
Sorry to come in part way, but maybe instead of calling read-char-will-hang-p and read-char, you might be able to get away with a specific function called #'read-char-no-hang *, which might be a better choice, as it is noted that it will specifically not hang. * http://www.ai.mit.edu/projects/iiip/doc/CommonLISP/HyperSpec/Body/fun_read-char-no-hang.html Jonathan Johansen On Sun, Sep 27, 2009 at 12:02 AM, Angel Popov <ang...@ya...> wrote: > > Thanks, > I have tried > [1]> (defvar com (open "COM3" :direction :io :buffered nil)) > COM > [2]> (read-char-will-hang com) > but hanged again > > --- On Sat, 9/26/09, Pascal J. Bourguignon <pj...@in...> wrote: > > > From: Pascal J. Bourguignon <pj...@in...> > > Subject: Re: [clisp-list] read-char-no-hang-p hangs on com port > > To: "Angel Popov" <ang...@ya...> > > Cc: cli...@li... > > Date: Saturday, September 26, 2009, 2:52 PM > > > > On Sep 26, 2009, at 11:01 AM, Angel Popov wrote: > > > > > Hi, > > > I am trying to read from serial port on windows using > > > http://downloads.sourceforge.net/project/clisp/clisp/2.48/clisp-2.48-win32-mingw-big.exe. > > > The problem is that read-char-no-hang-p hangs when > > there is no data on serial interface. > > > > > > sample session is: > > > CL-USER> (defvar com (open "COM3" :direction :io)) > > > > Try with: > > :buffered nil > > > > > > --__Pascal Bourguignon__ > > http://www.informatimago.com > > <snip> |
From: Angel P. <ang...@ya...> - 2009-09-27 14:36:38
|
Thanks but read-char-no-hang hangs too. --- On Sun, 9/27/09, Jonathan Johansen <fra...@gm...> wrote: > From: Jonathan Johansen <fra...@gm...> > Subject: Re: [clisp-list] read-char-no-hang-p hangs on com port > To: "Angel Popov" <ang...@ya...>, cli...@li... > Date: Sunday, September 27, 2009, 3:13 AM > Sorry to come in part way, but maybe > instead of calling > read-char-will-hang-p and read-char, you might be able to > get away > with a specific function called #'read-char-no-hang *, > which might be > a better choice, as it is noted that it will specifically > not hang. > > * http://www.ai.mit.edu/projects/iiip/doc/CommonLISP/HyperSpec/Body/fun_read-char-no-hang.html > > Jonathan Johansen > > On Sun, Sep 27, 2009 at 12:02 AM, Angel Popov <ang...@ya...> > wrote: > > > > Thanks, > > I have tried > > [1]> (defvar com (open "COM3" :direction :io > :buffered nil)) > > COM > > [2]> (read-char-will-hang com) > > but hanged again > > > > --- On Sat, 9/26/09, Pascal J. Bourguignon <pj...@in...> > wrote: > > > > > From: Pascal J. Bourguignon <pj...@in...> > > > Subject: Re: [clisp-list] read-char-no-hang-p > hangs on com port > > > To: "Angel Popov" <ang...@ya...> > > > Cc: cli...@li... > > > Date: Saturday, September 26, 2009, 2:52 PM > > > > > > On Sep 26, 2009, at 11:01 AM, Angel Popov wrote: > > > > > > > Hi, > > > > I am trying to read from serial port on > windows using > > > > http://downloads.sourceforge.net/project/clisp/clisp/2.48/clisp-2.48-win32-mingw-big.exe. > > > > The problem is that read-char-no-hang-p > hangs when > > > there is no data on serial interface. > > > > > > > > sample session is: > > > > CL-USER> (defvar com (open "COM3" > :direction :io)) > > > > > > Try with: > > > :buffered nil > > > > > > > > > --__Pascal Bourguignon__ > > > http://www.informatimago.com > > > > <snip> > |
From: Sam S. <sd...@gn...> - 2009-09-27 17:17:35
|
> * Angel Popov <natrycbcbi@lnubb.pbz> [2009-09-26 02:01:39 -0700]: > > I am trying to read from serial port on windows using > http://downloads.sourceforge.net/project/clisp/clisp/2.48/clisp-2.48-win32-mingw-big.exe. > The problem is that read-char-no-hang-p hangs when there is no data on serial interface. > > sample session is: > CL-USER> (defvar com (open "COM3" :direction :io)) > COM > CL-USER> com > #<IO UNBUFFERED FILE-STREAM CHARACTER #P"COM3" @1> > ... > CL-USER> (read-char-will-hang-p com) - Hang please compile with debug symbols (./configure --with-debug), run under gdb, stop in fd_read_wont_hang_p, and see where you hang. thanks. -- Sam Steingold (http://sds.podval.org/) on Ubuntu 9.04 (jaunty) http://ffii.org http://camera.org http://jihadwatch.org http://iris.org.il http://memri.org http://dhimmi.com http://mideasttruth.com http://pmw.org.il Experience comes with debts. |
From: Angel P. <ang...@ya...> - 2009-09-29 08:32:54
|
Thanks for the advise, Here is the debug session, but still cannot figure out what is going on. Found an article that could be related http://msdn.microsoft.com/en-us/library/ms687032(VS.85).aspx - It could be something with ENABLE_LINE_INPUT console mode. the lisp program is (defvar com (open "COM1" :direction :io)) (print (read-char-will-hang-p com)) The trace session: Breakpoint 1, fd_read_wont_hang_p (fd=0x73c) at ../src/win32aux.d:449 449 switch (GetFileType(fd)) { 1: fd = (HANDLE) 0x73c (gdb) s 453 if (GetNumberOfConsoleInputEvents(fd,&nevents)) { /* It's a console. */ 1: fd = (HANDLE) 0x73c (gdb) n 489 } else if (!(GetLastError()==ERROR_INVALID_HANDLE)) { 1: fd = (HANDLE) 0x73c (gdb) n 494 switch (WaitForSingleObject(fd,0)) { 1: fd = (HANDLE) 0x73c (gdb) s 496 return 1; Regards, AngelP 1: fd = (HANDLE) 0x73c (gdb) n 524 } 1: fd = (HANDLE) 0x73c (gdb) n listen_handle (handle=0x73c, tty_p=true, byte=0x22f444) at ../src/stream.d:4930 4930 if (wont_hang == 0) { 2: wont_hang = 1 (gdb) n 4933 if (wont_hang == 2) { 2: wont_hang = 1 (gdb) n 4936 if (wont_hang == 3) { 2: wont_hang = 1 (gdb) n 4941 var ssize_t result = full_read(handle,&b,1); 2: wont_hang = 1 (gdb) s fd_read (fd=0x73c, buf=0x22f40f, nbyte=1, persev=persev_full) at ../src/win32aux.d:651 651 params.fd = fd; (gdb) n 652 params.buf = buf; (gdb) disp buf 3: buf = (void *) 0x22f40f (gdb) n 653 params.nbyte = nbyte; 3: buf = (void *) 0x22f40f (gdb) disp nbyte 4: nbyte = 1 (gdb) n 654 params.persev = persev; 4: nbyte = 1 3: buf = (void *) 0x22f40f (gdb) n 655 params.retval = 0; 4: nbyte = 1 3: buf = (void *) 0x22f40f (gdb) n 656 params.errcode = 0; 4: nbyte = 1 3: buf = (void *) 0x22f40f (gdb) n 657 if (DoInterruptible(&do_fd_read,(void*)¶ms,false)) { 4: nbyte = 1 3: buf = (void *) 0x22f40f (gdb) n --- On Sun, 9/27/09, Sam Steingold <sd...@gn...> wrote: > From: Sam Steingold <sd...@gn...> > Subject: Re: read-char-no-hang-p hangs on com port > To: cli...@li..., "Angel Popov" <ang...@ya...> > Date: Sunday, September 27, 2009, 8:17 PM > > * Angel Popov <natrycbcbi@lnubb.pbz> > [2009-09-26 02:01:39 -0700]: > > > > I am trying to read from serial port on windows using > > http://downloads.sourceforge.net/project/clisp/clisp/2.48/clisp-2.48-win32-mingw-big.exe. > > The problem is that read-char-no-hang-p hangs when > there is no data on serial interface. > > > > sample session is: > > CL-USER> (defvar com (open "COM3" :direction :io)) > > COM > > CL-USER> com > > #<IO UNBUFFERED FILE-STREAM CHARACTER #P"COM3" > @1> > > ... > > CL-USER> (read-char-will-hang-p com) - Hang > > please compile with debug symbols (./configure > --with-debug), > run under gdb, stop in fd_read_wont_hang_p, and see where > you hang. > > thanks. > > -- > Sam Steingold (http://sds.podval.org/) on Ubuntu 9.04 > (jaunty) > http://ffii.org http://camera.org http://jihadwatch.org http://iris.org.il > http://memri.org http://dhimmi.com http://mideasttruth.com http://pmw.org.il > Experience comes with debts. > |
From: Vladimir T. <vtz...@gm...> - 2009-09-29 09:44:33
|
On 9/29/09, Angel Popov <ang...@ya...> wrote: > Thanks for the advise, > > Here is the debug session, but still cannot figure out what is going on. > Found an article that could be related > http://msdn.microsoft.com/en-us/library/ms687032(VS.85).aspx - It could be > something with ENABLE_LINE_INPUT console mode. > > the lisp program is > > (defvar com (open "COM1" :direction :io)) > (print (read-char-will-hang-p com)) > > The trace session: > > Breakpoint 1, fd_read_wont_hang_p (fd=0x73c) at ../src/win32aux.d:449 > 449 switch (GetFileType(fd)) { > 1: fd = (HANDLE) 0x73c > (gdb) s > 453 if (GetNumberOfConsoleInputEvents(fd,&nevents)) { /* It's a > console. */ > 1: fd = (HANDLE) 0x73c > (gdb) n > 489 } else if (!(GetLastError()==ERROR_INVALID_HANDLE)) { > 1: fd = (HANDLE) 0x73c > (gdb) n > 494 switch (WaitForSingleObject(fd,0)) { > 1: fd = (HANDLE) 0x73c > (gdb) s > 496 return 1; WaitForSingleObject cannot be used on serial port handles - http://msdn.microsoft.com/en-us/library/ms687032(VS.85).aspx. Notice that files and serial ports are not in the list - wondering why it does not return an error? For checking whether there are characters to be read - ClearCommError() may be used (http://msdn.microsoft.com/en-us/library/aa363180(VS.85).aspx). In order to use it we should have explicit knowledge that this is serial port handle or just try it an handle the error in case it's not (probably ERROR_INVALID_HANDLE). Sam? |
From: Sam S. <sd...@gn...> - 2009-09-29 16:18:54
|
Vladimir Tzankov wrote: > > For checking whether there are characters to be read - > ClearCommError() may be used > (http://msdn.microsoft.com/en-us/library/aa363180(VS.85).aspx). In > order to use it we should have explicit knowledge that this is serial > port handle or just try it an handle the error in case it's not > (probably ERROR_INVALID_HANDLE). right, something like this: --- win32aux.d.~1.59.~ 2009-09-29 12:00:52.000000000 -0400 +++ win32aux.d 2009-09-29 12:16:45.001480000 -0400 @@ -484,6 +484,19 @@ global int fd_read_wont_hang_p (HANDLE f return 0; } else if (!(GetLastError()==ERROR_INVALID_HANDLE)) OS_error(); + var DWORD errors; + var COMSTAT stat; + if (ClearCommError(fd,&errors,&stat)) { /* it's a serial comm dev */ + printf("[e=%d fCtsHold=%d fDsrHold=%d fRlsdHold=%d fXoffHold=%d fXoffSent=%d fEof=%d fTxim=%d cbInQue=%d cbOutQue=%d]\n", + errors,stat.fCtsHold,stat.fDsrHold,stat.fRlsdHold, + stat.fXoffHold,stat.fXoffSent,stat.fEof,stat.fTxim, + stat.cbInQue,stat.cbOutQue); + if (errors) return -1; /* errors */ + if (stat.fEof) return 2; + if (stat.cbInQue) return 3; + return 0; + } else if (!(GetLastError()==ERROR_INVALID_HANDLE)) + OS_error(); /* Not a console. */ switch (WaitForSingleObject(fd,0)) { case WAIT_OBJECT_0: /* a byte is available, or EOF */ Angel, could you please try this patch (against cvs head) and report the debug output? thanks! Sam. |
From: Angel P. <ang...@ya...> - 2009-09-30 05:38:41
|
It does not hang now and the output is: [e=0 fCtsHold=1 fDsrHold=0 fRlsdHold=0 fXoffHold=0 fXoffSent=0 fEof=0 fTxim=0 cbInQue=0 cbOutQue=0] Thanks, AngelP --- On Tue, 9/29/09, Sam Steingold <sd...@gn...> wrote: > From: Sam Steingold <sd...@gn...> > Subject: Re: read-char-no-hang-p hangs on com port > To: "Vladimir Tzankov" <vtz...@gm...> > Cc: cli...@li..., ang...@ya... > Date: Tuesday, September 29, 2009, 7:18 PM > Vladimir Tzankov wrote: > > > > For checking whether there are characters to be read > - > > ClearCommError() may be used > > (http://msdn.microsoft.com/en-us/library/aa363180(VS.85).aspx). > In > > order to use it we should have explicit knowledge that > this is serial > > port handle or just try it an handle the error in case > it's not > > (probably ERROR_INVALID_HANDLE). > > right, something like this: > > --- win32aux.d.~1.59.~ 2009-09-29 > 12:00:52.000000000 -0400 > +++ win32aux.d 2009-09-29 > 12:16:45.001480000 -0400 > @@ -484,6 +484,19 @@ global int fd_read_wont_hang_p (HANDLE > f > return 0; > } else if > (!(GetLastError()==ERROR_INVALID_HANDLE)) > OS_error(); > + var DWORD errors; > + var COMSTAT stat; > + if > (ClearCommError(fd,&errors,&stat)) { /* it's a > serial comm dev */ > + printf("[e=%d fCtsHold=%d > fDsrHold=%d fRlsdHold=%d fXoffHold=%d fXoffSent=%d fEof=%d > fTxim=%d cbInQue=%d cbOutQue=%d]\n", > + > errors,stat.fCtsHold,stat.fDsrHold,stat.fRlsdHold, > + > stat.fXoffHold,stat.fXoffSent,stat.fEof,stat.fTxim, > + > stat.cbInQue,stat.cbOutQue); > + if (errors) return -1; > /* errors > */ > + if (stat.fEof) return 2; > + if (stat.cbInQue) return 3; > + return 0; > + } else if > (!(GetLastError()==ERROR_INVALID_HANDLE)) > + OS_error(); > /* Not a console. */ > switch > (WaitForSingleObject(fd,0)) { > case > WAIT_OBJECT_0: /* a byte is > available, or EOF */ > > > Angel, could you please try this patch (against cvs head) > and report the debug output? > > thanks! > > Sam. > > > |
From: Angel P. <ang...@ya...> - 2009-09-30 06:13:15
|
Work like a charm. I could not resist to post a real session too: [14]> (format com "AT~%") NIL [15]> (loop for x = (read-char-no-hang com nil nil) :while x :collect x) [e=0 fCtsHold=0 fDsrHold=0 fRlsdHold=0 fXoffHold=0 fXoffSent=0 fEof=0 fTxim=0 cbInQue=9 cbOutQue=0] [e=0 fCtsHold=0 fDsrHold=0 fRlsdHold=0 fXoffHold=0 fXoffSent=0 fEof=0 fTxim=0 cbInQue=8 cbOutQue=0] [e=0 fCtsHold=0 fDsrHold=0 fRlsdHold=0 fXoffHold=0 fXoffSent=0 fEof=0 fTxim=0 cbInQue=7 cbOutQue=0] [e=0 fCtsHold=0 fDsrHold=0 fRlsdHold=0 fXoffHold=0 fXoffSent=0 fEof=0 fTxim=0 cbInQue=6 cbOutQue=0] [e=0 fCtsHold=0 fDsrHold=0 fRlsdHold=0 fXoffHold=0 fXoffSent=0 fEof=0 fTxim=0 cbInQue=5 cbOutQue=0] [e=0 fCtsHold=0 fDsrHold=0 fRlsdHold=0 fXoffHold=0 fXoffSent=0 fEof=0 fTxim=0 cbInQue=4 cbOutQue=0] [e=0 fCtsHold=0 fDsrHold=0 fRlsdHold=0 fXoffHold=0 fXoffSent=0 fEof=0 fTxim=0 cbInQue=3 cbOutQue=0] [e=0 fCtsHold=0 fDsrHold=0 fRlsdHold=0 fXoffHold=0 fXoffSent=0 fEof=0 fTxim=0 cbInQue=2 cbOutQue=0] [e=0 fCtsHold=0 fDsrHold=0 fRlsdHold=0 fXoffHold=0 fXoffSent=0 fEof=0 fTxim=0 cbInQue=1 cbOutQue=0] [e=0 fCtsHold=0 fDsrHold=0 fRlsdHold=0 fXoffHold=0 fXoffSent=0 fEof=0 fTxim=0 cbInQue=0 cbOutQue=0] (#\A #\T #\Newline #\Newline #\O #\K #\Newline) Thanks a lot! Regards, AngelP --- On Wed, 9/30/09, Angel Popov <ang...@ya...> wrote: > From: Angel Popov <ang...@ya...> > Subject: Re: [clisp-list] read-char-no-hang-p hangs on com port > To: "Vladimir Tzankov" <vtz...@gm...>, "clisp-list" <cli...@li...> > Cc: cli...@li... > Date: Wednesday, September 30, 2009, 8:38 AM > It does not hang now and the output > is: > > [e=0 fCtsHold=1 fDsrHold=0 fRlsdHold=0 fXoffHold=0 > fXoffSent=0 fEof=0 fTxim=0 cbInQue=0 cbOutQue=0] > > Thanks, AngelP > --- On Tue, 9/29/09, Sam Steingold <sd...@gn...> > wrote: > > > From: Sam Steingold <sd...@gn...> > > Subject: Re: read-char-no-hang-p hangs on com port > > To: "Vladimir Tzankov" <vtz...@gm...> > > Cc: cli...@li..., > ang...@ya... > > Date: Tuesday, September 29, 2009, 7:18 PM > > Vladimir Tzankov wrote: > > > > > > For checking whether there are characters to be > read > > - > > > ClearCommError() may be used > > > (http://msdn.microsoft.com/en-us/library/aa363180(VS.85).aspx). > > In > > > order to use it we should have explicit knowledge > that > > this is serial > > > port handle or just try it an handle the error in > case > > it's not > > > (probably ERROR_INVALID_HANDLE). > > > > right, something like this: > > > > --- win32aux.d.~1.59.~ 2009-09-29 > > 12:00:52.000000000 -0400 > > +++ win32aux.d 2009-09-29 > > 12:16:45.001480000 -0400 > > @@ -484,6 +484,19 @@ global int fd_read_wont_hang_p > (HANDLE > > f > > return 0; > > } else if > > (!(GetLastError()==ERROR_INVALID_HANDLE)) > > OS_error(); > > + var DWORD errors; > > + var COMSTAT stat; > > + if > > (ClearCommError(fd,&errors,&stat)) { /* it's > a > > serial comm dev */ > > + printf("[e=%d fCtsHold=%d > > fDsrHold=%d fRlsdHold=%d fXoffHold=%d fXoffSent=%d > fEof=%d > > fTxim=%d cbInQue=%d cbOutQue=%d]\n", > > + > > > errors,stat.fCtsHold,stat.fDsrHold,stat.fRlsdHold, > > + > > > stat.fXoffHold,stat.fXoffSent,stat.fEof,stat.fTxim, > > + > > stat.cbInQue,stat.cbOutQue); > > + if (errors) return -1; > > /* errors > > */ > > + if (stat.fEof) return 2; > > + if (stat.cbInQue) return 3; > > + return 0; > > + } else if > > (!(GetLastError()==ERROR_INVALID_HANDLE)) > > + OS_error(); > > /* Not a console. */ > > switch > > (WaitForSingleObject(fd,0)) { > > case > > WAIT_OBJECT_0: /* a byte is > > available, or EOF */ > > > > > > Angel, could you please try this patch (against cvs > head) > > and report the debug output? > > > > thanks! > > > > Sam. > > > > > > > > > > > ------------------------------------------------------------------------------ > Come build with us! The BlackBerry® Developer > Conference in SF, CA > is the only developer event you need to attend this year. > Jumpstart your > developing skills, take BlackBerry mobile applications to > market and stay > ahead of the curve. Join us from November 9-12, 2009. > Register now! > http://p.sf.net/sfu/devconf > _______________________________________________ > clisp-list mailing list > cli...@li... > https://lists.sourceforge.net/lists/listinfo/clisp-list > |
From: Sam S. <sd...@gn...> - 2009-09-30 14:54:16
|
Angel Popov wrote: > Work like a charm. committed. thanks for testing. Sam. |