Annotation of gforth/contrib/serial.fs, revision 1.1

1.1     ! anton       1: \ serial.fs
        !             2: \
        !             3: \ gforth interface words for Linux serial communcations.
        !             4: \
        !             5: \ Copyright (c) 2000--2004 David P. Wallace, Krishna Myneni
        !             6: \ Provided under the terms of the GNU General Public License
        !             7: \
        !             8: \ Requires:
        !             9: \
        !            10: \      strings.fs
        !            11: \      syscalls386.fs
        !            12: \
        !            13: \ Revisions:
        !            14: \
        !            15: \      3-13-2000  first working version
        !            16: \      6-03-2001  modified serial_open to disable XON/XOFF flow control,
        !            17: \                      added bit constants for c_iflag, etc.,
        !            18: \                      modified serial_setparams for readability  KM
        !            19: \      12-13-2001  modified serial_open to disable CR to NL translation.  KM
        !            20: \       9-17-2004  ported from kForth  KM
        !            21: 
        !            22: \ termios structure
        !            23: 
        !            24: create termios 4 4 + 4 + 4 + 2 + 64 + 4 + 4 + allot
        !            25: 
        !            26: 0 constant C_IFLAG
        !            27: 4 constant C_OFLAG
        !            28: 8 constant C_CFLAG
        !            29: 12 constant C_LFLAG
        !            30: 16 constant C_LINE
        !            31: 18 constant C__CC
        !            32: 82 constant C_ISPEED
        !            33: 86 constant C_OSPEED
        !            34: 
        !            35: \ c_iflag bits
        !            36: 
        !            37:    1 constant IGNBRK
        !            38:    2 constant BRKINT
        !            39:    4 constant IGNPAR
        !            40:    8 constant PARMRK
        !            41:   16 constant INPCK
        !            42:   32 constant ISTRIP
        !            43:   64 constant INLCR
        !            44:  128 constant IGNCR
        !            45:  256 constant ICRNL
        !            46:  512 constant IUCLC
        !            47: 1024 constant IXON
        !            48: 2048 constant IXANY
        !            49: 4096 constant IXOFF
        !            50: 8192 constant IMAXBEL
        !            51: 
        !            52: \ c_oflag bits
        !            53: 
        !            54:    1 constant OPOST
        !            55:    2 constant OLCUC
        !            56:    4 constant ONLCR
        !            57:    8 constant OCRNL
        !            58:   16 constant ONOCR
        !            59:   32 constant ONLRET
        !            60:   64 constant OFILL
        !            61:  128 constant OFDEL
        !            62:  256 constant NLDLY
        !            63: 
        !            64: \ c_cflag bits
        !            65:                        \ baud rates constants
        !            66: 4111 constant CBAUD
        !            67:    0 constant B0
        !            68:    7 constant B300
        !            69:    9 constant B1200
        !            70:   11 constant B2400
        !            71:   12 constant B4800
        !            72:   13 constant B9600
        !            73:   14 constant B19200
        !            74:   15 constant B38400
        !            75: 4097 constant B57600
        !            76: 4098 constant B115200
        !            77:                        \ character size constants
        !            78:   48 constant CSIZE
        !            79:    0 constant CS5
        !            80:   16 constant CS6
        !            81:   32 constant CS7
        !            82:   48 constant CS8
        !            83: 
        !            84: \ parity constants
        !            85: 
        !            86: 768 constant CPARITY
        !            87: 0 constant PARNONE
        !            88: 256 constant PAREVEN
        !            89: 768 constant PARODD
        !            90: 
        !            91: \ stop bits constants
        !            92: 
        !            93: 64 constant CSTOPB
        !            94: 0 constant ONESTOPB
        !            95: 64 constant TWOSTOPB
        !            96: 
        !            97: \ c_lflag bits
        !            98: 
        !            99:    1 constant ISIG
        !           100:    2 constant ICANON
        !           101:    4 constant XCASE
        !           102:    8 constant ECHO
        !           103:   16 constant ECHOE
        !           104:   32 constant ECHOK
        !           105:   64 constant ECHONL
        !           106:  128 constant NOFLSH
        !           107:  256 constant TOSTOP
        !           108:  512 constant ECHOCTL
        !           109: 1024 constant ECHOPRT
        !           110: 2048 constant ECHOKE
        !           111: 4096 constant FLUSHO
        !           112: 16384 constant PENDIN
        !           113: 32768 constant IEXTEN
        !           114: 
        !           115: \ com port constants
        !           116: 
        !           117: 0 constant COM1
        !           118: 1 constant COM2
        !           119: 2 constant COM3
        !           120: 3 constant COM4
        !           121: 
        !           122: 
        !           123: \ ioctl request constants
        !           124: 
        !           125: hex
        !           126: 5401 constant TCGETS
        !           127: 5402 constant TCSETS
        !           128: 540B constant TCFLSH
        !           129: 541B constant FIONREAD
        !           130: decimal
        !           131: 
        !           132: \ file control constants
        !           133: 
        !           134: hex
        !           135: 800 constant O_NDELAY
        !           136: 100 constant O_NOCTTY
        !           137: 002 constant O_RDWR
        !           138: decimal
        !           139: 
        !           140: 
        !           141: : serial_getoptions ( handle -- | read serial port options into termios )
        !           142:        TCGETS termios ioctl drop ;
        !           143:        
        !           144: : serial_setoptions ( handle -- | write termios into serial port options )
        !           145:        TCSETS termios ioctl drop ;
        !           146:        
        !           147: : serial_open ( port -- handle | opens the serial port for communcation )
        !           148:        \ port is the serial port to open
        !           149:        \ 0 = ttyS0 (COM1)
        !           150:        \ 1 = ttyS1 (COM2)
        !           151:        \ 2 = ttyS2 (COM3)
        !           152:        \ 3 = ttyS3 (COM4)
        !           153:        \ handle is a handle to the open serial port
        !           154:        \ if handle < 0 there was an error opening the port
        !           155:        dup
        !           156:        0 >=
        !           157:        if
        !           158:                s>string count
        !           159:                s" /dev/ttyS"
        !           160:                2swap
        !           161:                strcat
        !           162:                strpck
        !           163:                O_RDWR O_NOCTTY  O_NDELAY or or
        !           164:                open
        !           165:                dup
        !           166:                dup
        !           167:                serial_getoptions
        !           168:        
        !           169:                \ Disable XON/XOFF flow control and CR to NL mapping
        !           170: 
        !           171:                termios C_IFLAG + @
        !           172:                IXON IXOFF or IXANY or ICRNL or ( not) invert and
        !           173:                termios C_IFLAG + !
        !           174: 
        !           175:                \ Open for raw input
        !           176: 
        !           177:                termios C_LFLAG + @
        !           178:                ISIG ICANON or ECHO or ECHOE or ( not) invert
        !           179:                and
        !           180:                termios C_LFLAG + !
        !           181: 
        !           182:                \ Open for raw output
        !           183: 
        !           184:                termios C_OFLAG + @
        !           185:                OPOST ( not) invert
        !           186:                and
        !           187:                termios C_OFLAG + !
        !           188:                serial_setoptions
        !           189:        then ;
        !           190:        
        !           191: : serial_close ( handle -- | closes the port )
        !           192:        \ handle = serial port handle received from serial_open
        !           193:        
        !           194:        close ;
        !           195: 
        !           196: : serial_write ( handle buf num_to_write -- num_written )
        !           197:        \ handle = serial port handle received from serial_open
        !           198:        \ buf = address to buffer that holds chars to be written
        !           199:        \ num_to_write = number of chars to write
        !           200:        \ num_written = number of chars actually written
        !           201:        write ;
        !           202:        
        !           203: : serial_read ( handle buf num_to_read -- num_read )
        !           204:        \ handle = serial port handle received from serial_open
        !           205:        \ buf = address to buffer to hold chars to being read
        !           206:        \ num_to_read = number of chars to read
        !           207:        \ num_read = number of chars actually read
        !           208:        read ;
        !           209:        
        !           210: : serial_setbaud ( handle baud -- )
        !           211:        \ handle = serial port handle received from serial_open
        !           212:        \ baud = desired baud rate ( use constants defined above )
        !           213:        swap
        !           214:        dup
        !           215:        serial_getoptions
        !           216:        \ set the baud rate
        !           217:        swap
        !           218:        termios C_CFLAG + @
        !           219:        CBAUD ( not) invert and
        !           220:        or
        !           221:        termios C_CFLAG + !
        !           222:        serial_setoptions ;
        !           223: 
        !           224: : serial_setparity ( handle parity -- )
        !           225:        \ handle = serial port handle received from serial_open
        !           226:        \ parity = desired parity ( use constants defined above )
        !           227:        swap
        !           228:        dup
        !           229:        serial_getoptions
        !           230:        \ set the parity
        !           231:        swap
        !           232:        termios C_CFLAG + @
        !           233:        CPARITY ( not) invert and
        !           234:        or
        !           235:        termios C_CFLAG + !
        !           236:        serial_setoptions ;
        !           237: 
        !           238: : serial_setstopbits ( handle stopbits -- )
        !           239:        \ handle = serial port handle received from serial_open
        !           240:        \ stopbits = desired number of stopbits ( constants above )
        !           241:        swap
        !           242:        dup
        !           243:        serial_getoptions
        !           244:        \ set the stop_bit
        !           245:        swap
        !           246:        termios C_CFLAG + @
        !           247:        CSTOPB ( not) invert and
        !           248:        or
        !           249:        termios C_CFLAG + !
        !           250:        serial_setoptions ;
        !           251: 
        !           252: : serial_setdatabits ( handle databits -- )
        !           253:        \ handle = serial port handle received from serial_open
        !           254:        \ databits = desired number of databits ( constants above )
        !           255:        swap
        !           256:        dup
        !           257:        serial_getoptions
        !           258:        \ set the data size
        !           259:        swap
        !           260:        termios C_CFLAG + @
        !           261:        CSIZE ( not) invert and
        !           262:        or
        !           263:        termios C_CFLAG + !
        !           264:        serial_setoptions ;
        !           265: 
        !           266: : serial_flush ( handle -- )
        !           267:        \ handle = serial port handle received from serial_open
        !           268:        TCFLSH 2 ioctl drop ;
        !           269: 
        !           270: variable inque
        !           271:        
        !           272: : serial_lenrx ( handle -- rx_len)
        !           273:        \ handle = serial port handle received from serial_open
        !           274:        \ rx_len = number of chars in recieve que
        !           275:        FIONREAD inque ioctl drop
        !           276:        inque @ ;               
        !           277: 
        !           278: : serial_setparams ( handle ^str -- )
        !           279:        \ ^str examples are 8N1, 7E1, etc.
        !           280:        swap >r
        !           281:        dup
        !           282:        1+ c@
        !           283:        case
        !           284:          [char] 8 of r@ CS8 serial_setdatabits endof
        !           285:          [char] 7 of r@ CS7 serial_setdatabits endof
        !           286:        endcase
        !           287: 
        !           288:        dup
        !           289:        2 + c@
        !           290:        case
        !           291:          [char] N of r@ PARNONE serial_setparity endof
        !           292:          [char] E of r@ PAREVEN serial_setparity endof
        !           293:          [char] O of r@ PARODD serial_setparity endof
        !           294:        endcase
        !           295: 
        !           296:        3 + c@
        !           297:        case
        !           298:          [char] 1 of r@ ONESTOPB serial_setstopbits endof
        !           299:          [char] 2 of r@ TWOSTOPB serial_setstopbits endof
        !           300:        endcase
        !           301:        
        !           302:        r> drop ;
        !           303:        
        !           304: 
        !           305:                
        !           306:                        
        !           307:                
        !           308:                

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>