[comp.windows.ms] Sample Windows code for using Comm port

usenet@cps3xx.UUCP (Usenet file owner) (02/01/89)

/*
 *  Sample code for a simple terminal emulation under Windows.
 *  This is from my first Windows program--let me know if there's something
 *  poor in here!  (Complete source to entire program not included
 *  due to size--available upon request.)
 *  Mark Riordan    riordanmr@clvax1.cl.msu.edu   31 Jan 1989
 */

/*  This first code fragment sets up the comm port */

int CommDevice;

    if(retcode = BuildCommDCB("COM1:2400,n,8",(DCB FAR *) &DCBCom1)) {
        sprintf(mesbuf,"BuildComm returned %d",retcode);
        MessageBox(hWndConf,mesbuf,"Error building COM1 DCB",MB_OK|MB_ICONEXCLAMATION);
    } else {
        CommDevice = OpenComm("COM1",1024,1024);
        if(CommDevice < 0) {
            sprintf(mesbuf,"OpenComm returned %d",CommDevice);
            MessageBox(hWndConf,mesbuf,"Error opening COM1",MB_OK|MB_ICONEXCLAMATION);

        } else {
            SetCommState((DCB FAR *) &DCBCom1);
        }
    }
/* ------------------------------------------------------------ */
/* This routine manages a window that acts as a terminal screen */

#include "windows.h"
#include "mrr1.h"
#include "newmemos.h"
#include "winundoc.h"
#include "mrr1glob.h"


/****************************************************************************

    FUNCTION: Mrr1TermWndProc(HWND, unsigned, WORD, LONG)


****************************************************************************/

long FAR PASCAL Mrr1TermWndProc(hWnd, message, wParam, lParam)
HWND hWnd;
unsigned message;
WORD wParam;
LONG lParam;
{
    FARPROC lpProcAbout;
    HMENU hMenu;

    PAINTSTRUCT ps;                              /* paint structure          */

    HDC hDC;                                    /* handle to display context */

    char ch, kch;
    int ChCount;
    char mesbuf[60];

    switch (message) {
        case WM_SYSCOMMAND:
            return (DefWindowProc(hWnd, message, wParam, lParam));
            break;

        case WM_CREATE:

            /* Set the timer for 0.1-second intervals */

            idTimer =  SetTimer(hWnd, NULL, 100, (FARPROC) NULL);
            xPos = SideSpace;
            yPos = TopSpace;

            break;

        case WM_CHAR:
            /* Just send any keyboard characters out the Comm port. */
            kch = wParam & 0x7f;
            WriteComm(CommDevice,(LPSTR) &kch, 1);

            break;

        case WM_KEYDOWN:
            break;

        case WM_TIMER:
            /* Each timer tick, check to see if any characters have arrived. */
            hDC = GetDC(hWnd);
            while(ChCount = ReadComm(CommDevice,(LPSTR) &ch,1)) {
                ch &= 0x7f;
                InterpHostChar(ch);
            }

            ReleaseDC(hWnd,hDC);
            break;


        case WM_COMMAND:
            switch(wParam) {

              case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            }
            break;

        case WM_PAINT:
            /* Repaint the window from the characters we have saved */
            /* in the Lines array.                                  */
            hDC = BeginPaint (hWnd, &ps);

            X = SideSpace;
            Y = TopSpace;

            for(il=0; il<MAXLINES; il++) {
              TextOut(hDC,X,Y,&(Lines[il][0]),strlen(&(Lines[il][0])));
              Y += LineHeight;
            }
            EndPaint(hWnd, &ps);
            break;


        case WM_DESTROY:
            KillTimer(hWnd, idTimer);                     /* Stops the timer */
            NTerminals--;
            break;

        default:
            return (DefWindowProc(hWnd, message, wParam, lParam));
    }
    return (NULL);
}

/*---  Function InterpHostChar ---------------------------------------
 *   Process a character just received on the Comm port.
 *   Interpret CR, LF, and NULL, and display all other characters
 *   as printing characters on the screen.
 *   Save the character in an array in case we have to repaint.
 */

InterpHostChar(ch)
char ch;
{
    if(ch == '\r') {
        xPos = SideSpace;
        TermCol = 0;
    } else if(ch == '\n') {
        yPos += LineHeight;
        if(++TermRow >= MAXLINES) {
            TermRow = 0;
            yPos = 0;
        }
    } else if(ch == '\0') {
        /* do nothing */
    } else {
        Lines[TermRow][TermCol] = ch;
        TextOut(hDC,xPos,yPos,&ch,1);

        xPos += CharWidth;
        TermCol++;

    }
}

/* ----------------------------------------------------- */
/*
 *  Finally, when the application is being terminated, we close
 *  the comm port.
 *  Failure to do so will leave it open and unavailable for other apps.
 */
        case WM_DESTROY:
            CloseComm(CommDevice);