From 9e8179457b49de0ee52ab40192a88971fc3c01e6 Mon Sep 17 00:00:00 2001 From: plugwash Date: Fri, 19 Aug 2011 00:07:28 +0000 Subject: [PATCH] add O_NONBLOCK in lserial.pas, apparently some serial ports need this to open successfully and it's also consistent with how we open other stuff git-svn-id: file:///svnroot/lcore/trunk@102 b1de8a11-f9be-4011-bde0-cc7ace90066a --- lserial.pas | 140 ++++++++++++++++++++++++++-------------------------- 1 file changed, 70 insertions(+), 70 deletions(-) diff --git a/lserial.pas b/lserial.pas index e7b6d27..cee4727 100755 --- a/lserial.pas +++ b/lserial.pas @@ -1,71 +1,71 @@ {$mode delphi} -unit lserial; -interface -uses - lcore; - -type - tlserial=class(tlasio) - public - device: string; - baudrate: longint; - procedure open; - end; - - -implementation -uses - baseunix, - unix, - unixutil, - termio, // despite the name the fpc termio unit seems to be an interface to termios - sysutils; -procedure tlserial.open; -var - fd : longint; - config : termios; - baudrateos : longint; -begin - fd := fpopen(device,O_RDWR or O_NOCTTY); - - if isatty(fd)=0 then begin - writeln('not a tty'); - halt(1); - end; - - fillchar(config,sizeof(config),#0); - config.c_cflag := CLOCAL or CREAD; - cfmakeraw(config); - case baudrate of - 50: baudrateos := B50; - 75: baudrateos := B75; - 110: baudrateos := B110; - 134: baudrateos := B134; - 150: baudrateos := B150; - 200: baudrateos := B200; - 300: baudrateos := B300; - 600: baudrateos := B600; - 1200: baudrateos := B1200; - 1800: baudrateos := B1800; - 2400: baudrateos := B2400; - 4800: baudrateos := B4800; - 9600: baudrateos := B9600; - 19200: baudrateos := B19200; - 38400: baudrateos := B38400; - 57600: baudrateos := B57600; - 115200: baudrateos := B115200; - 230400: baudrateos := B230400; - else raise exception.create('unrecognised baudrate'); - end; - cfsetispeed(config,baudrateos); - cfsetospeed(config,baudrateos); - config.c_cc[VMIN] := 1; - config.c_cc[VTIME] := 0; - if tcsetattr(fd,TCSAFLUSH,config) <0 then begin - writeln('could not set termios attributes'); - halt(3); - end; - dup(fd); - closehandles := true; -end; -end. \ No newline at end of file +unit lserial; +interface +uses + lcore; + +type + tlserial=class(tlasio) + public + device: string; + baudrate: longint; + procedure open; + end; + + +implementation +uses + baseunix, + unix, + unixutil, + termio, // despite the name the fpc termio unit seems to be an interface to termios + sysutils; +procedure tlserial.open; +var + fd : longint; + config : termios; + baudrateos : longint; +begin + fd := fpopen(device,O_RDWR or O_NOCTTY or O_NONBLOCK); + + if isatty(fd)=0 then begin + writeln('not a tty'); + halt(1); + end; + + fillchar(config,sizeof(config),#0); + config.c_cflag := CLOCAL or CREAD; + cfmakeraw(config); + case baudrate of + 50: baudrateos := B50; + 75: baudrateos := B75; + 110: baudrateos := B110; + 134: baudrateos := B134; + 150: baudrateos := B150; + 200: baudrateos := B200; + 300: baudrateos := B300; + 600: baudrateos := B600; + 1200: baudrateos := B1200; + 1800: baudrateos := B1800; + 2400: baudrateos := B2400; + 4800: baudrateos := B4800; + 9600: baudrateos := B9600; + 19200: baudrateos := B19200; + 38400: baudrateos := B38400; + 57600: baudrateos := B57600; + 115200: baudrateos := B115200; + 230400: baudrateos := B230400; + else raise exception.create('unrecognised baudrate'); + end; + cfsetispeed(config,baudrateos); + cfsetospeed(config,baudrateos); + config.c_cc[VMIN] := 1; + config.c_cc[VTIME] := 0; + if tcsetattr(fd,TCSAFLUSH,config) <0 then begin + writeln('could not set termios attributes'); + halt(3); + end; + dup(fd); + closehandles := true; +end; +end. -- 2.30.2