|
|
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; }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.