Annotation of pmsdk/samples/comtalk/comport.c, revision 1.1.1.1

1.1       root        1: /*
                      2:    comport.c -- This file contains the sources for COM port manipulation.
                      3:    Created by Microsoft Corporation, 1989
                      4: */
                      5: #define  INCL_DOSFILEMGR
                      6: #define         INCL_DOSDEVICES
                      7: #define         INCL_DOSDEVIOCTL
                      8: #include <os2.h>
                      9: #include "global.h"
                     10: #include "comport.h"
                     11: /*
                     12:    Constants
                     13: */
                     14: #define        XON     0x11    /* Ctrl Q */
                     15: #define        XOFF    0x13    /* Ctrl S */
                     16: char   CRLF[2] = { 0x0d, 0x0a };
                     17: 
                     18: /*
                     19:     Variables
                     20: */
                     21: DCBINFO                dcbinfo;        /* Device control block for Ioctl 53H, 73H */
                     22: HFILE          hPort;
                     23: LINECONTROL    lnctlBuf;
                     24: int            rc;
                     25: USHORT         usErrWord;
                     26: 
                     27: int ComFlush(void) {
                     28: /*
                     29:     Flush the COM port with Category 11 functions
                     30: */
                     31:     BYTE Data, Zero = 0;
                     32: 
                     33:     /* Call Category 11 Functions 1H, 2H  Flush Input, Output Buffers */
                     34:     if (rc = DosDevIOCtl(&Data, &Zero, 0x01, 11, hPort)) return rc;
                     35:     if (rc = DosDevIOCtl(&Data, &Zero, 0x02, 11, hPort)) return rc;
                     36:     return 0;
                     37: }
                     38: 
                     39: int ComInit(COM comTerm) {
                     40: /*
                     41:     Open the COM port according to the specifications
                     42: */
                     43:     USHORT action;
                     44: 
                     45:     /* Get File Handle for COM port (shared read/write access) */
                     46:     if (rc = DosOpen(comTerm.szPort,&hPort, &action, 0L, 0, 0x0001, 0x0042, 0L))
                     47:        return rc;
                     48: 
                     49:     /* Call Category 1 Function 41H   Set Baud Rate */
                     50:     if (rc = DosDevIOCtl(NULL, &comTerm.usBaud, 0x41, 1, hPort)) return rc;
                     51: 
                     52:     /* Call Category 1 Function 42H   Set Line Characteristics */
                     53:     lnctlBuf.bDataBits = comTerm.bData;
                     54:     lnctlBuf.bParity   = comTerm.bParity;
                     55:     lnctlBuf.bStopBits = comTerm.bStop - 20;   /* IDD_ONESTOP = 20 */
                     56:     if (rc = DosDevIOCtl(NULL, &lnctlBuf, 0x42, 1, hPort)) return rc;
                     57: 
                     58:     /* Call Category 1 Function 73H   Query Device Control Block */
                     59:     if (rc = DosDevIOCtl(&dcbinfo, 0L, 0x73, 1, hPort)) return rc;
                     60: 
                     61:     /*
                     62:        Do we want software handshaking?
                     63:     */
                     64:     dcbinfo.fbFlowReplace      &= ~(0x03);     /* Clear bits 0 and 1 */
                     65:     dcbinfo.fbFlowReplace      |=
                     66:        (comTerm.fSoftware)     ? (MODE_AUTO_TRANSMIT | MODE_AUTO_RECEIVE) : 0;
                     67:     /*
                     68:        Do we want hardware handshaking?
                     69:     */
                     70:     /* Turn on DTR, if appropriate */
                     71:     dcbinfo.fbCtlHndShake      &= ~(0x03);     /* Clear bits 0 and 1 */
                     72:     dcbinfo.fbCtlHndShake      |= ((comTerm.fHardware) ? MODE_DTR_CONTROL : 0);
                     73: 
                     74:     /* Turn on RTS, if appropriate */
                     75:     dcbinfo.fbFlowReplace      &= ~(0xc0);     /* Clear bits 6 and 7 */
                     76:     dcbinfo.fbFlowReplace      |= ((comTerm.fHardware) ? MODE_RTS_CONTROL : 0);
                     77: 
                     78:     /* Adjust CTS output handshaking */
                     79:     dcbinfo.fbCtlHndShake      &= ~MODE_CTS_HANDSHAKE;     /* Clear bit 3 */
                     80:     dcbinfo.fbCtlHndShake      |= ((comTerm.fHardware)?MODE_CTS_HANDSHAKE:0);
                     81: 
                     82:     /* Adjust DSR output handshaking */
                     83:     dcbinfo.fbCtlHndShake      &= ~MODE_DSR_HANDSHAKE;     /* Clear bit 4 */
                     84:     dcbinfo.fbCtlHndShake      |= ((comTerm.fHardware)?MODE_DSR_HANDSHAKE:0);
                     85: 
                     86:     /* Turn off DCD output handshaking */
                     87:     dcbinfo.fbCtlHndShake      &= ~MODE_DCD_HANDSHAKE;     /* Clear bit 5 */
                     88: 
                     89:     /* Adjust DSR input sensitivity */
                     90:     dcbinfo.fbCtlHndShake      &= ~MODE_DSR_SENSITIVITY;   /* Clear bit 6 */
                     91:     dcbinfo.fbCtlHndShake      |= ((comTerm.fHardware)?MODE_DSR_SENSITIVITY:0);
                     92:     /*
                     93:        Set the line to Wait for Character, Read mode
                     94:     */
                     95:     dcbinfo.fbTimeout          &= ~(0x06);     /* Clear bits, then set */
                     96:     dcbinfo.fbTimeout          |= MODE_WAIT_READ_TIMEOUT;
                     97:     dcbinfo.usReadTimeout      = -1;           /* Never! */
                     98:  
                     99:     /* Call Category 1 Function 53H   Set Device Control Block */
                    100:     if (rc = DosDevIOCtl(0L, &dcbinfo, 0x53, 1, hPort)) return rc;
                    101: 
                    102:     /* Get ready to start */
                    103:     return ComFlush();
                    104: }
                    105: 
                    106: USHORT ComRead(Line pli) {
                    107: /*
                    108:     Reads all characters present
                    109:     Returns:   0 if successful
                    110:                nonzero (Dos Error or Com Error Word) if unsuccessful
                    111: */
                    112:     /* Read from the port... And snatch as many as you can! (blocking read) */
                    113:     if (rc = DosRead(hPort, pli->szText, MAXLINELEN, &(pli->cch))) return rc;
                    114: 
                    115:     /* Check the COM Error Word */
                    116:     if (rc = DosDevIOCtl(&usErrWord, NULL, 0x6d, 1, hPort)) return rc;
                    117: 
                    118:     /* ...then return it */
                    119:     return usErrWord;
                    120: }
                    121: 
                    122: int ComWrite(char ch) {
                    123: /*
                    124:     Write a character at a time
                    125: 
                    126:     Okay as long as you don't type too fast
                    127: */
                    128:     USHORT nCharsWritten;
                    129: 
                    130:     return DosWrite(hPort, &ch, 1, &nCharsWritten);
                    131: }
                    132: 
                    133: int ComClose(void) {
                    134: /*
                    135:     Close the COM port
                    136: */
                    137:     if (rc = ComFlush()) return rc;
                    138:     return DosClose(hPort);
                    139: } 
                    140: 
                    141: int ComBreak(void) {
                    142: /*
                    143:     Set BREAK mode ON
                    144: */
                    145:     USHORT ComErr;
                    146: 
                    147:     /* Call Category 1 Function 4BH -- Set Break On */
                    148:     return DosDevIOCtl(&ComErr, NULL, 0x4b, 1, hPort);
                    149: }
                    150: 
                    151: int ComUnbreak(void) {
                    152: /*
                    153:     Set BREAK mode OFF
                    154: */
                    155:     USHORT ComErr;
                    156: 
                    157:     /* Call Category 1 Function 45H -- Set Break Off */
                    158:     return DosDevIOCtl(&ComErr, NULL, 0x45, 1, hPort);
                    159: }
                    160: 
                    161: int ComError(void) { return (int) usErrWord; }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.